Para explicar, primeiro precisamos explicar as classes aninhadas no Scala. Considere este exemplo simples:
class A {
class B
def f(b: B) = println("Got my B!")
}
Agora vamos tentar algo com isso:
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 você declara uma classe dentro de outra classe no Scala, está dizendo que cada instância dessa classe possui uma subclasse. Em outras palavras, não há nenhuma A.B
classe, mas existem a1.B
e a2.B
aulas, e eles são diferentes classes, como a mensagem de erro está nos dizendo acima.
Se você não entendeu isso, procure os tipos dependentes do caminho.
Agora, #
é possível consultar essas classes aninhadas sem restringi-las a uma instância específica. Em outras palavras, não existe A.B
, mas existe A#B
, o que significa uma B
classe aninhada de qualquer instância de A
.
Podemos ver isso no trabalho, alterando o código acima:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
E experimentando:
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.