2012-05-02 17 views
12

intentado esto:¿Cómo probar el valor de ser AnyVal?

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

y esto:

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 
        ^

El mensaje es muy informativo. Entiendo que no puedo usarlo, pero ¿qué debo hacer?

Respuesta

12

Asumo que desea probar si algo es un valor primitivo:

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 
+5

O si no desea utilizar el truco 'null':' def testAnyVal [T] (x: T) (implícito m: Manifiesto [T]) = m <:

+3

@TravisBrown - O si no desea escribir un parámetro manifiesto explícito, 'def testAnyVal [T: Manifiesto] (t: T) = manifiesto [T] <:

+0

@Rex: Derecha, eso es más agradable, solo me apegaba más a la formulación de Thipor. –

12

Asumo que su tipo es realmente Any o si ya lo sabría si era o no AnyVal. Por desgracia, cuando el tipo es Any, usted tiene que probar todos los tipos primitivos separado (he elegido los nombres de las variables aquí para que coincida con las designaciones de JVM internos para los tipos primitivos):

(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") 
} 

Esto funciona, impresiones I, y no da un error de coincidencia incompleto.

Cuestiones relacionadas