14

试过这个:

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
                      ^

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

4

2 回答 2

17

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

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
于 2012-05-02T16:02:19.020 回答
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,并且不会给出不完整的匹配错误。

于 2012-05-02T16:34:08.970 回答