2012-05-02 13 views
12

Tried to:Jak przetestować wartość na byciu AnyVal?

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

a to:

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 
        ^

Przesłanie jest bardzo pouczające. Rozumiem, że nie mogę tego użyć, ale co mam zrobić?

Odpowiedz

12

zakładam chcesz sprawdzić, czy coś jest wartością pierwotną:

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

Lub jeśli nie chcesz używać sztuczki 'null': def testAnyVal [T] (x: T) (implicit m: Manifest [T]) = m <:

+3

@TravisBrown - lub jeśli nie chcesz pisać jawnego parametru jawnego, 'def testAnyVal [T: Manifest] (t: T) = manifest [T] <:

+0

@Rex: Right, ładniej - po prostu trzymałem się ściśle sformułowania Thipora. –

12

Zakładam, że Twój typ jest rzeczywiście Any albo że już wiem, czy był to AnyVal lub nie. Niestety, gdy typ jest Any, trzeba przetestować wszystkie prymitywne typy oddzielnie (wybrałem nazwy zmiennych, żeby dopasować wewnętrzne oznaczenia JVM dla prymitywnych typów):

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

To działa, drukuje I, i nie daje niekompletnego błędu dopasowania.

Powiązane problemy