在Java中,無法直接用型別來引用目前型別多變的。當嘗試編寫可以傳回目前類型實例的方法時,就會出現問題,這在處理子類型時會出現問題。例如,在基底類別中聲明傳回類型 T 的泛型方法將引用子類別中的基底類別類型,而不是實際的子類別類型。
為了解決這個問題,可以採用遞歸邊界和抽象類別層次結構,如下所示:
abstract class SelfTyped<SELF extends SelfTyped<SELF>> { abstract SELF self(); } class MyBaseClass<SELF extends MyBaseClass<SELF>> extends SelfTyped<SELF> { MyBaseClass() { } public SELF baseMethod() { return self(); } } final class MyLeafClass extends MyBaseClass<MyLeafClass> { @Override MyLeafClass self() { return this; } public MyLeafClass leafMethod() { return self(); } }
在透過這種方法,葉類將遞歸型別參數SELF 解析為它們自己的型別並實作self()。葉類可以直接使用,允許方法鏈接,同時保留正確的返回類型:
MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod(); AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();
注意:這種技術依賴於奇怪的重複模板模式(CRT)並引入了一定的風險:
為了減輕這些風險,請確保所涉及的類不可公開擴展,並考慮對SelfTyped 和self().
雖然此解決方法提供了一種引用當前類型的方法,但它引入了額外的複雜性和限制。建議在實施之前仔細權衡其好處和潛在缺點。在顯式類型引用至關重要的情況下,此解決方案可能很有用,但請避免過度依賴它或在公共 API 中。
以上是如何在 Java 中使用類型變數引用目前型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!