2012-05-02 41 views
12

Cố gắng này:Làm cách nào để kiểm tra giá trị trên AnyVal?

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

và điều này:

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 
        ^

Thông điệp là rất nhiều thông tin. Tôi nhận được rằng tôi không thể sử dụng nó, nhưng tôi nên làm gì?

Trả lời

12

tôi giả sử bạn muốn kiểm tra nếu một cái gì đó là một giá trị nguyên thủy:

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

Hoặc nếu bạn không muốn sử dụng thủ thuật 'null':' def testAnyVal [T] (x: T) (ngầm định m: Tệp kê khai [T]) = m <:

+3

@TravisBrown - Hoặc nếu bạn không muốn viết một thông số khai báo rõ ràng, 'def testAnyVal [T: Manifest] (t: T) = biểu hiện [T] <:

+0

@Rex: Phải, đẹp hơn - tôi chỉ gắn bó chặt chẽ hơn với công thức của Thipor. –

12

tôi cho rằng kiểu của bạn thực sự là Any hoặc bạn muốn đã biết cho dù đó là AnyVal hay không. Thật không may, khi loại của bạn là Any, bạn phải kiểm tra tất cả các loại nguyên thủy riêng (tôi đã chọn tên biến vào đây để phù hợp với các chỉ định JVM nội bộ cho các loại nguyên thủy):

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

này hoạt động, bản in I, và không đưa ra lỗi trùng khớp không hoàn chỉnh.

Các vấn đề liên quan