如何测试AnyVal的值?

时间:2012-05-02 15:17:36

标签: scala

试过这个:

scala> 2.isInstanceOf[AnyVal]
<console>:8: error: type AnyVal cannot be used in a type pattern or isInstanceOf test
              2.isInstanceOf[AnyVal]
                            ^

和此:

scala> 12312 match {
     | case _: AnyVal => true
     | case _ => false
     | }
<console>:9: error: type AnyVal cannot be used in a type pattern or isInstanceOf test
              case _: AnyVal => true
                      ^

这条消息非常有用。我知道我不能使用它,但我该怎么办?

2 个答案:

答案 0 :(得分:16)

我假设你想测试某些东西是否是原始值:

def testAnyVal[T](x: T)(implicit evidence: T <:< AnyVal = null) = evidence != null

println(testAnyVal(1))                    // true
println(testAnyVal("Hallo"))              // false
println(testAnyVal(true))                 // true
println(testAnyVal(Boolean.box(true)))    // false

答案 1 :(得分:12)

我认为您的类型实际上是Any,或者您已经知道它是否为AnyVal。不幸的是,当你的类型是Any时,你必须分别测试所有基本类型(我在这里选择了变量名来匹配基元类型的内部JVM名称):

(2: Any) match {
  case u: Unit => println("Unit")
  case z: Boolean => println("Z")
  case b: Byte => println("B")
  case c: Char => println("C")
  case s: Short => println("S")
  case i: Int => println("I")
  case j: Long => println("J")
  case f: Float => println("F")
  case d: Double => println("D")
  case l: AnyRef => println("L")
}

这样可行,打印I,并且不会给出不完整的匹配错误。