Aby to wyjaśnić, najpierw musimy wyjaśnić zagnieżdżone klasy w Scali. Rozważmy ten prosty przykład:
class A {
class B
def f(b: B) = println("Got my B!")
}
Teraz spróbujmy czegoś z tym:
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)
^
Kiedy deklarujesz klasę wewnątrz innej klasy w Scali, mówisz, że każda instancja tej klasy ma taką podklasę. Innymi słowy, nie ma A.B
klasy, ale istnieją a1.B
i a2.B
klasy i są to różne klasy, o czym informuje nas powyżej komunikat o błędzie.
Jeśli tego nie rozumiesz, poszukaj typów zależnych od ścieżki.
Teraz #
umożliwia odwoływanie się do takich zagnieżdżonych klas bez ograniczania ich do konkretnej instancji. Innymi słowy, nie ma A.B
, ale istnieje A#B
, co oznacza B
zagnieżdżoną klasę dowolnej instancji A
.
Możemy to zobaczyć w działaniu, zmieniając powyższy kod:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
I wypróbować:
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.