Um es zu erklären, müssen wir zuerst verschachtelte Klassen in Scala erklären. Betrachten Sie dieses einfache Beispiel:
class A {
class B
def f(b: B) = println("Got my B!")
}
Versuchen wir jetzt etwas damit:
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)
^
Wenn Sie eine Klasse in einer anderen Klasse in Scala deklarieren, sagen Sie, dass jede Instanz dieser Klasse eine solche Unterklasse hat. Mit anderen Worten, es gibt keine A.B
Klasse, aber es gibt a1.B
und a2.B
Klassen, und sie sind verschiedene Klassen, wie die Fehlermeldung oben sagt.
Wenn Sie das nicht verstanden haben, suchen Sie nach pfadabhängigen Typen.
Jetzt #
können Sie auf solche verschachtelten Klassen verweisen, ohne sie auf eine bestimmte Instanz zu beschränken. Mit anderen Worten, es gibt keine A.B
, aber es gibt A#B
eine B
verschachtelte Klasse einer beliebigen Instanz von A
.
Wir können dies in der Arbeit sehen, indem wir den obigen Code ändern:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
Und probieren Sie es aus:
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.