Pour l'expliquer, nous devons d'abord expliquer les classes imbriquées dans Scala. Prenons cet exemple simple:
class A {
class B
def f(b: B) = println("Got my B!")
}
Maintenant, essayons quelque chose avec:
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)
^
Lorsque vous déclarez une classe dans une autre classe dans Scala, vous dites que chaque instance de cette classe a une telle sous-classe. En d' autres termes, il n'y a pas de A.B
classe, mais il y a a1.B
et des a2.B
classes, et ils sont différents des classes, comme le message d'erreur nous dit ci - dessus.
Si vous ne comprenez pas cela, recherchez les types dépendants du chemin.
Maintenant, #
vous permet de faire référence à de telles classes imbriquées sans la limiter à une instance particulière. En d'autres termes, il n'y a pas A.B
, mais il y a A#B
, ce qui signifie une B
classe imbriquée de n'importe quelle instance de A
.
Nous pouvons voir cela dans le travail en modifiant le code ci-dessus:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
Et l'essayer:
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.