2010-06-22 17 views
9

चेतावनी: मैं #scala से क्रॉस-पोस्टिंग कर रहा हूँसंबंध

स्काला में पुस्तक प्रोग्रामिंग कहा गया है कि पथ पर निर्भर प्रकार प्रश्न में पथ का सही उदाहरण के आधार पर अलग-अलग हैं । यदि हां, तो मुझे समझ नहीं आता क्यों सभी निम्नलिखित विधेय सच वापसी:

class Outer { 
    val in = new Inner 
    class Inner 
} 

val o1 = new Outer 
val o2 = new Outer 

o1.in.isInstanceOf[Outer#Inner] //makes perfect sense 
o1.in.isInstanceOf[o1.Inner] //still makes sense, the path-dependent type is o1's own 
o1.in.isInstanceOf[o2.Inner] //why is this true? PiS p.423 says the path-dependent types are different, they only share a common supertype Outer#Inner 
+4

मुझे एक बग की तरह लग रहा है, लेकिन यह मिटाने का परिणाम हो सकता है। मिलान करना, जिसे प्राथमिकता के रूप में पसंद किया जाता है/asInstanceOf, अपेक्षा के अनुसार काम करता है। –

उत्तर

11

o1.Inner और o2.Inner विभिन्न प्रकार हैं, लेकिन उनके मिटाया ही कर रहे हैं:

scala> class Outer { 
    | val in = new Inner 
    | class Inner 
    | } 
defined class Outer 

scala> val o1 = new Outer 
o1: Outer = [email protected] 

scala> val m1 = implicitly[Manifest[o1.Inner]] 
m1: Manifest[o1.Inner] = [email protected]#Outer$Inner 

scala> m1.erasure 
res0: java.lang.Class[_] = class Outer$Inner 

scala> val o2 = new Outer 
o2: Outer = [email protected] 

scala> val m2 = implicitly[Manifest[o2.Inner]] 
m2: Manifest[o2.Inner] = [email protected]#Outer$Inner 

scala> m2.erasure 
res1: java.lang.Class[_] = class Outer$Inner 

और o1.in.isInstanceOf[o2.Inner] केवल देख सकते हैं कि o1.ino2.Inner के क्षरण का एक उदाहरण है।

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