首頁 >Java >java教程 >如何在 Java 中使用類型變數引用目前型別?

如何在 Java 中使用類型變數引用目前型別?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-18 08:02:10421瀏覽

How Can I Refer to the Current Type with a Type Variable in Java?

有沒有辦法用型別變數來引用目前型別?

在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)並引入了一定的風險:

  • 類型替換漏洞:派生類別可以覆蓋SELF以傳回不同的類型,損害self 類型保證。
  • 不正確的 self() 實作: self() 的衍生類別實作可能無法準確地傳回目前實例。

為了減輕這些風險,請確保所涉及的類不可公開擴展,並考慮對SelfTyped 和self().

評估和使用注意事項

雖然此解決方法提供了一種引用當前類型的方法,但它引入了額外的複雜性和限制。建議在實施之前仔細權衡其好處和潛在缺點。在顯式類型引用至關重要的情況下,此解決方案可能很有用,但請避免過度依賴它或在公共 API 中。

以上是如何在 Java 中使用類型變數引用目前型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn