Para explicarlo, primero tenemos que explicar las clases anidadas en Scala. Considere este simple ejemplo:
class A {
class B
def f(b: B) = println("Got my B!")
}
Ahora intentemos algo con eso:
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)
^
Cuando declaras una clase dentro de otra clase en Scala, estás diciendo que cada instancia de esa clase tiene dicha subclase. En otras palabras, no hay A.B
clase, pero hay a1.B
y a2.B
clases, y son diferentes clases, como el mensaje de error nos dice más arriba.
Si no entendió eso, busque los tipos dependientes de la ruta.
Ahora, #
le permite referirse a tales clases anidadas sin restringirlo a una instancia particular. En otras palabras, no hay A.B
, pero hay A#B
, lo que significa una B
clase anidada de cualquier instancia de A
.
Podemos ver esto en el trabajo cambiando el código anterior:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
Y probándolo:
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.