我有一个代码,AnyVal类型数据f应根据输入参数转换为Float / Double。
if (n == 4) {
if (f.asInstanceOf[Float].isNaN) None
else Some(f)
} else {
if (f.asInstanceOf[Double].isNaN) None
else Some(f)
}
我尝试使用变量来获取此代码,但是我有一个错误。
val t = if (n == 4) classOf[Float] else classOf[Double]
if (f.asInstanceOf[t].isNaN) None
else Some(f)
可能出现什么问题?
答案 0 :(得分:2)
t
此处的类型为Class[_ >: Float with Double <: AnyVal]
,因为scala会找到classOf[Float]
和classOf[Double]
的常见超类型,同时Alexey Romanov指出,t
是一个变量而asInstanceOf
采用类型参数,简单的解决方案是:
val t: Option[Double] =
if (n == 4) Option(f.asInstanceOf[Float]) else Option(f.asInstanceOf[Double])
返回Option[Double]
,因为Double
是一个常见的超类型(*)到Float
,对于一个更复杂的解决方案,你带来变量中的类型我无法帮助你。
(*)它不是真正的超类型,但Scala有从Float到Double的视图。
答案 1 :(得分:2)
t
是一个值,而不是一个类型,asInstanceOf
后的方括号表示它需要一个类型参数。你不能拥有这样的变量类型(有类型变量这样的东西,但它们在这里没有用)。 Ende Neu的答案中给出了一种可能的解决方法;另一个是
t.cast(f)
但这不会在这里工作,因为你无法在结果上拨打isNaN
。