इसे समझाने के लिए, हमें सबसे पहले स्काला में नेस्टेड क्लासेस को समझाना होगा। इस सरल उदाहरण पर विचार करें:
class A {
class B
def f(b: B) = println("Got my B!")
}
अब इसके साथ कुछ करने की कोशिश करते हैं:
scala> val a1 = new A
a1: A = A@2fa8ecf4
scala> val a2 = new A
a2: A = A@4bed4c8
scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
found : a1.B
required: a2.B
a2.f(new a1.B)
^
जब आप स्काला में किसी अन्य वर्ग के अंदर एक वर्ग घोषित करते हैं, तो आप कह रहे हैं कि उस वर्ग के प्रत्येक उदाहरण में ऐसा उपवर्ग है। दूसरे शब्दों में, कोई A.B
वर्ग नहीं है , लेकिन वहाँ a1.B
और a2.B
कक्षाएं हैं, और वे अलग - अलग वर्ग हैं, जैसा कि त्रुटि संदेश हमें ऊपर बता रहा है।
यदि आपको समझ नहीं आया, तो पथ निर्भर प्रकार देखें।
अब, #
यह संभव है कि आप किसी विशेष उदाहरण के लिए इस तरह के नेस्टेड वर्गों को संदर्भित किए बिना संदर्भित कर सकें। दूसरे शब्दों में, वहाँ कोई नहीं है A.B
, लेकिन वहाँ है A#B
, जिसका अर्थ है किसी भी उदाहरण के एक B
नेस्टेड वर्ग ।A
उपरोक्त कोड को बदलकर हम इसे काम में देख सकते हैं:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
और इसे आजमा रहे हैं:
scala> val a1 = new A
a1: A = A@1497b7b1
scala> val a2 = new A
a2: A = A@2607c28c
scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
found : a1.B
required: a2.B
a2.f(new a1.B)
^
scala> a2.g(new a1.B)
Got a B.