在Scala中使用变量进行类型检查代码

时间:2014-08-12 16:47:19

标签: scala types

我有一个代码,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)

enter image description here

可能出现什么问题?

2 个答案:

答案 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