Ответ 1
Чтобы объяснить это, сначала нужно объяснить вложенные классы в Scala. Рассмотрим этот простой пример:
class A {
class B
def f(b: B) = println("Got my B!")
}
Теперь попробуйте что-нибудь с ним:
scala> val a1 = new A
a1: A = [email protected]
scala> val a2 = new A
a2: A = [email protected]
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 = [email protected]
scala> val a2 = new A
a2: A = [email protected]
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.