[英]How to initialize variable of Type in Scala?
我是scala的新手,对这个愚蠢的问题感到抱歉。 我想从此Scala代码中删除return语句(我的实际情况比这复杂得多)
def readValue[Type](value: Any)(implicit tag: ClassTag[Type]): Type = {
if (value == null) {
return null.asInstanceOf[Type]
} else {
if (classOf[URL].isAssignableFrom(tag.runtimeClass)) {
return new URL(value.toString).asInstanceOf[Type]
}
if (classOf[URI].isAssignableFrom(tag.runtimeClass)) {
return new URI(value.toString).asInstanceOf[Type]
}
null.asInstanceOf[Type]
}
}
这就是为什么我要存储Type实例的返回值,如下所示:
def readValue[Type](value: Any)(implicit tag: ClassTag[Type]): Type = {
var retVal:Type = null
if (value == null) {
// retVal=...
}
else {
// if cond: retVal=...
}
retVal
}
上面的解决方案无法编译。 如何初始化Type
的变量?
if-else
是表达式 ,而不仅仅是scala中的语句 :
def readValue[Type](value: Any)(implicit tag: ClassTag[Type]): Type = {
if (value == null) {
null.asInstanceOf[Type]
} else if (classOf[URL].isAssignableFrom(tag.runtimeClass)) {
new URL(value.toString).asInstanceOf[Type]
} else if (classOf[URI].isAssignableFrom(tag.runtimeClass)) {
new URI(value.toString).asInstanceOf[Type]
} else {
null.asInstanceOf[Type]
}
}
还要注意, classOf[A].isAssignableFrom(classOf[B])
意味着类型B
的值b
可以向下转换为b.asInstanceOf[A]
,而不是相反。 如果classOf[URL].isAssignableFrom(tag.runtimeClass)
,则允许您将Type
的值转换为URL
, 而不是相反 。
此外,如果将参数Type
限制为Type >: Null
,则代码将起作用。
大概是这样的:
Option(value)
.map { _.toString }
.map { v => tag.runtimeClass.getConstructor(v.getClass).newInstance(v) }
.map { _.asInstanceOf[Type] }
.orNull
或者,如果您希望避免反射:
val contructors: Map[Class[_], String => Any] = Map(
classOf[URL] -> { s => new URL(s) }
classOf[Uri] -> { s => new URI(s) }
}
Option(value)
.map { _.toString }
.map { constructors(tag.runtimeClass).apply(_) }
.map { _.asInstanceOf[Type] }
.orNull
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.