2011-08-14 25 views
8

अगर मैं "scalac -explaintypes" चलाने के लिए और की तरह कुछ देखें:स्केलैक-एक्सप्लेन्टिस: "<notype><: एक्स?" क्या करता है क्या मतलब है?

Nothing <: ThingManager? 
    <notype> <: ThingManager? 
    false 
true 

क्या लाइन है "< notype> <: ThingManager" क्या मतलब है?

क्या इसका मतलब है "कोई प्रकार संभवतः थिंगमेनगर के अनुरूप नहीं हो सकता"?

+0

यह इस आउटपुट को ट्रिगर करने वाले कोड का एक छोटा स्निपेट शामिल करने में मदद करेगा। – retronym

उत्तर

6

-explain-types चेक को सबटाइप करने के लिए सभी कॉल का पता लगाता है। इंडेंटेशन का उपयोग रिकर्सिव कॉल दिखाने के लिए किया जाता है।

यहां एक छोटा उदाहरण है:

scala210 -explaintypes -e '0 : java.lang.String' 
scalacmd9062993631372828655.scala:1: error: type mismatch; 
found : Int(0) 
required: java.lang.String 
0 : java.lang.String 
^ 
one error found 
Int(0) <: java.lang.String? 
    Int <: java.lang.String? 
    <notype> <: java.lang.String? 
    false 
    false 
false 

प्रत्यावर्तन के तीन स्तर हैं। पहला कॉल यह जांच रहा है कि UniqueConstantType(0) <:< UniqueTypeRef(String) है या नहीं। एलएचएस शाब्दिक पूर्णांक के लिए एक सिंगलटन प्रकार है। चेक considering उस सिंगलटन प्रकार UniqueTypeRef(Int) <:< UniqueTypeRef(String) के अंतर्निहित प्रकार से जारी है।

अनुरूपता की जांच तो searches वर्ग String (base type) की Int के महाप्रकार के लिए, और उसके बाद पता चल सके कि इस String के अनुरूप है। ऐसा कोई सुपरटेप नहीं है, इसलिए NoType वापस कर दिया गया है। <:< पर रिकर्सिव कॉल आउटपुट <notype> <: java.lang.String की ओर जाता है।

sym2.isClass && { 
    val base = tr1 baseType sym2 // UniqueTypeRef(Int) baseType String => NoType 
    (base ne tr1) && base <:< tr2 
} 

NoType एक शून्य ऑब्जेक्ट है। (कंपाइलर NoSymbol, NoPosition) के लिए इस पैटर्न का भी उपयोग करता है।

+0

बहुत जानकारीपूर्ण, धन्यवाद। –

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