2012-05-02 7 views
12

इस कोशिश कीAnyVal होने पर मूल्य का परीक्षण कैसे करें?</p> <pre><code>scala> 2.isInstanceOf[AnyVal] <console>:8: error: type AnyVal cannot be used in a type pattern or isInstanceOf test 2.isInstanceOf[AnyVal] ^ </code></pre> <p>और इस:

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 
        ^

संदेश बहुत जानकारीपूर्ण है। मुझे लगता है कि मैं इसका उपयोग नहीं कर सकता, लेकिन मुझे क्या करना चाहिए?

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 

उत्तर

12

मैं तुम्हें अगर कुछ एक आदिम मूल्य है परीक्षण करना चाहते हैं मान। दुर्भाग्य से, जब अपने प्रकार 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, और एक अपूर्ण मिलान त्रुटि नहीं देता है।

+5

या यदि आप 'शून्य' चाल का उपयोग नहीं करना चाहते हैं: 'def testAnyVal [T] (x: T) (अंतर्निहित एम: मैनिफेस्ट [टी]) = एम <:

+3

@TravisBrown - या यदि आप एक स्पष्ट मैनिफेस्ट पैरामीटर नहीं लिखना चाहते हैं, 'def testAnyVal [टी: मैनिफेस्ट] (टी: टी) = मैनिफेस्ट [टी] <:

+0

@Rex: दाएं, यह अच्छा है- मैं बस थिपोर के फॉर्मूलेशन के लिए अधिक बारीकी से चिपक रहा था। –

12

मुझे लगता है कि अपने प्रकार वास्तव में Any है या आप पहले से ही पता था कि क्या यह AnyVal था या नहीं:

संबंधित मुद्दे