在 Java 語言的 Jam 擴展中,mixin 的超類類型沒有名稱;我們就不能在 mixin 主體中引用它。這一限制會迅速引起一連串各種其它問題。例如,在 Jam 中,禁止程序員將 this 作為參數傳遞給方法;無法對這樣的調用進行類型檢查。這一限制的影響極大,因為許多最常見的設計模式都要依靠于能夠將 this 作為參數傳遞。
請考慮訪問者模式,其中用 for 方法為復合層次結構中的每個類都定義了訪問者類。通常被訪問的類包含 accept 方法,它采用訪問者并傳遞 this 來調用該訪問者的方法。因此,在 Jam 中,訪問者模式不能和 mixin 一起使用。
將 mixin 明確表述為泛型類,我們就始終有父類的句柄,它是該類繼續的類型參數。例如,我們可以將 Scrollable 的父類引用為類型 T。其結果是,在答應將 this 作為類型參數傳遞時沒有任何根本性的困難。
解決這一問題的各種方案與我們上月第 3 部分中討論的針對檢查 new 表達式的類型參數所提出的解決方案完全一致,因為超級構造函數調用和 new 表達式都引用了給定類的同一個類構造函數。讓我們回顧一下這些解決方案:
需要一個不帶參數的(zeroary)構造函數,用于所有類型參數的實例化。 當沒有匹配的構造函數時,拋出運行時異常。 包含額外的類型參數注釋,告知我們這些實例化必須包含哪些構造函數。 就如 new 表達式的情況,前兩個解決方案有嚴重缺陷。通常在類定義中包含不帶參數的構造函數沒有任何意義。而且,當不存在任何匹配的構造函數時就拋出異常也不太理想。究竟靜態類型檢查主要是嚴格防止那種異常。
第三種解決方案可能有點繁瑣,但是它有許多優點。注釋類型參數,其中包括所有實例化都必須擁有的構造函數集。這些注釋確切地告知我們針對類型參數,我們可以可靠地調用什么樣的構造函數。因此,當類型參數 T 用作泛型類的超類時,T 的注釋確切地告知我們可以調用哪些超級構造函數。假如 T 不包含注釋,那么類型檢查器會禁止它用作超類。