Подтвердить что ты не робот

Как проверить значение на AnyVal?

Пробовал это:

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
                      ^

Сообщение очень информативное. Я понимаю, что не могу его использовать, но что мне делать?

4b9b3361

Ответ 1

Я предполагаю, что вы хотите проверить, является ли что-то примитивным значением:

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

Ответ 2

Я предполагаю, что ваш тип на самом деле 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 и не дает ошибки неполного соответствия.