Untuk menjelaskannya, pertama-tama kita harus menjelaskan kelas bersarang di Scala. Pertimbangkan contoh sederhana ini:
class A {
class B
def f(b: B) = println("Got my B!")
}
Sekarang mari kita coba sesuatu dengannya:
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)
^
Ketika Anda mendeklarasikan kelas di dalam kelas lain di Scala, Anda mengatakan bahwa setiap instance dari kelas itu memiliki subclass seperti itu. Dengan kata lain, tidak ada A.B
kelas, tetapi ada a1.B
dan a2.B
kelas, dan mereka adalah kelas yang berbeda , seperti pesan kesalahan memberitahu kita di atas.
Jika Anda tidak mengerti itu, cari tipe jalan yang tergantung.
Sekarang, #
buatlah kemungkinan bagi Anda untuk merujuk ke kelas bertingkat seperti itu tanpa membatasi ke instance tertentu. Dengan kata lain, tidak ada A.B
, tapi ada A#B
, yang berarti B
kelas bersarang dari setiap contoh A
.
Kita dapat melihat ini sedang bekerja dengan mengubah kode di atas:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
Dan mencobanya:
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.