Scala中優秀的書編程有着相當不錯的explanation:
class Outer {
class Inner
}
在斯卡拉,內部類使用表達式Outer#Inner
而不是Java的Outer.Inner
來解決。 .
語法是爲對象保留的。例如,假設您實例Outer
類型的兩個對象,像這樣:
val o1 = new Outer
val o2 = new Outer
這裏o1.Inner
和o2.Inner
兩種路徑依賴的類型(和他們是不同類型的)。這兩種類型都符合(是更一般類型Outer#Inner
的(是其中的子類型)),它表示具有Outer類型的任意外部對象的Inner類。相比之下,o1.Inner
類型引用具有特定外部對象的內部類(從o1
引用的那個)。同樣,o2.Inner
類型引用具有不同的特定外部對象(從o2
引用的一個)的Inner類。
在Scala中,和Java一樣,內部類實例持有對封閉外部類實例的引用。例如,這允許內部類訪問其外部類的成員。因此,如果不以某種方式指定外部類實例,則不能實例化內部類。一種方法是在外部類的主體內部實例化內部類。在這種情況下,將使用當前的外部類實例(由此引用)。另一種方法是使用路徑依賴類型。例如,由於類型,o1.Inner,名稱的特定外對象,可以實例化:
scala> new o1.Inner
res1: o1.Inner = [email protected]
將所得內對象將包含一個參考到其外對象,從o1
引用的對象。相比之下,由於類型Outer#Inner
不名的Outer
任何特定的情況下,你不能創建它的實例:
scala> new Outer#Inner
<console>:6: error: Outer is not a legal prefix for
a constructor
new Outer#Inner
^
與使用「A#B」的語法解釋什麼聯繫呢?第一次看到這個,謝謝 – 2011-05-12 11:45:17
'A#B'被稱爲*類型投影*。 – 2011-05-12 12:42:14