Để giải thích nó, trước tiên chúng ta phải giải thích các lớp lồng nhau trong Scala. Hãy xem xét ví dụ đơn giản này:
class A {
class B
def f(b: B) = println("Got my B!")
}
Bây giờ hãy thử một cái gì đó với nó:
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)
^
Khi bạn khai báo một lớp bên trong một lớp khác trong Scala, bạn đang nói rằng mỗi phiên bản của lớp đó có một lớp con như vậy. Nói cách khác, không có A.B
lớp, nhưng có a1.B
và a2.B
các lớp, và chúng là các lớp khác nhau , vì thông báo lỗi đang nói với chúng tôi ở trên.
Nếu bạn không hiểu điều đó, hãy tìm các loại phụ thuộc đường dẫn.
Bây giờ, #
làm cho bạn có thể tham khảo các lớp lồng nhau như vậy mà không giới hạn nó trong một trường hợp cụ thể. Nói cách khác, không có A.B
, nhưng có A#B
, có nghĩa là một B
lớp lồng của bất kỳ trường hợp nàoA
.
Chúng ta có thể thấy điều này trong công việc bằng cách thay đổi mã ở trên:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
Và thử nó:
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.