Bunu açıklamak için önce Scala'da yuvalanmış sınıfları açıklamalıyız. Şu basit örneği düşünün:
class A {
class B
def f(b: B) = println("Got my B!")
}
Şimdi onunla bir şeyler deneyelim:
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)
^
Scala'da başka bir sınıfın içinde bir sınıf bildirdiğinizde , o sınıfın her örneğinin böyle bir alt sınıfa sahip olduğunu söylüyorsunuz . Başka bir deyişle, A.B
sınıf yoktur , ancak yukarıda hata mesajının bize söylediği gibi, a1.B
ve a2.B
sınıflar vardır ve bunlar farklı sınıflardır.
Bunu anlamadıysanız, yola bağlı türleri arayın.
Şimdi, #
belirli bir örnekle sınırlandırmadan bu tür iç içe geçmiş sınıflara başvurmanızı mümkün kılar. Başka bir deyişle, yok A.B
, ama var A#B
, bu da herhangi bir örneğinin B
iç içe geçmiş bir sınıfı anlamına geliyor .A
Bunu, yukarıdaki kodu değiştirerek görebiliriz:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
Ve denemek:
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.