Щоб пояснити це, спершу треба пояснити вкладені класи у Scala. Розглянемо цей простий приклад:
class A {
class B
def f(b: B) = println("Got my B!")
}
Тепер спробуємо щось із цим:
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)
^
Коли ви оголошуєте клас всередині іншого класу в Scala, ви говорите, що кожен екземпляр цього класу має такий підклас. Іншими словами, A.B
класу немає , але є a1.B
і a2.B
класи, і вони різні класи, як повідомляє нам про помилку вище.
Якщо ви цього не зрозуміли, знайдіть типи залежних від шляху.
Тепер #
ви даєте можливість посилатися на такі вкладені класи, не обмежуючи це конкретним екземпляром. Іншими словами, немає A.B
, але є A#B
, що означає B
вкладений клас будь-якого примірника A
.
Це ми можемо побачити в роботі, змінивши код вище:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
І випробування:
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.