Per spiegarlo, dobbiamo prima spiegare le classi nidificate in Scala. Considera questo semplice esempio:
class A {
class B
def f(b: B) = println("Got my B!")
}
Ora proviamo qualcosa con esso:
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)
^
Quando dichiari una classe all'interno di un'altra classe in Scala, stai dicendo che ogni istanza di quella classe ha una tale sottoclasse. In altre parole, non esiste una A.B
classe, ma ci sono a1.B
e a2.B
classi e sono classi diverse , come ci dice il messaggio di errore sopra.
Se non lo capisci, cerca i tipi dipendenti dal percorso.
Ora, #
ti consente di fare riferimento a tali classi nidificate senza limitarlo a una particolare istanza. In altre parole, non c'è A.B
, ma c'è A#B
, il che significa una B
classe nidificata di qualsiasi istanza di A
.
Possiamo vederlo al lavoro modificando il codice sopra:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
E provandolo:
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.