簡體   English   中英

在超類方法中返回泛型超類的子類

[英]Returning Subclass of generic superclass in a superclass method

我是來自PHP背景的Java新手,很抱歉,如果這很明顯的話。 我正在嘗試實現二叉樹類,我已經創建了一個ADT,如下所示:

public abstract class BTree<T> {
    private T value;
    private BTree<T> leftChild;
    private BTree<T> rightChild;
    private BTree<T> parent;
    public BTree<T> getLeftChild() { return this.leftChild; }
    ....
} 

然后我有另一個類擴展這樣的類:

public class BIntTree extends BTree<Integer> {
}

但是我希望能夠在BIntTree中有一個方法,我可以調用this.getLeftChild(); 並獲取一個BIntTree實例,而不是BTree<Integer>的實例

這可能通過某種方式定義泛型類/方法,或者在使用this.getLeftChild()后甚至覆蓋超類方法時是否必須顯式地輸入它?

我目前的解決方案是使用BIntTree b=(BIntTree) this.getLeftChild();在BIntTree方法中明確地對其進行類型轉換BIntTree b=(BIntTree) this.getLeftChild(); 這對我來說似乎不整潔。

此外,我不太確定如果我定義了類型轉換並且getLeftChild()返回null會發生什么,是否會引發異常? 如果是這樣,我如何解決這個問題,因為如果存在,null也是一個有效值?

有可能有一個自我類型的類,但你不得不想知道為什么你想要它。 為什么你需要知道它是一個BIntTree而不是BTree<Integer> 您使用仿制葯獲得了什么?

無論如何,你可以做這樣的事情:

public abstract class BTree<V, T extends BTree<V, T>> {
    public T getLeft() {...}
    public T getRight() {...}
    public V getValue() {...}
}

那么你的BIntTree就是

public class BIntTree extends BTree<Integer, BIntTree> {
    //...
}

編輯

關於關於轉換null的問題,實際上並沒有什么能阻止您自己測試行為。 但是要回答你的問題,將null為任何類型都是安全的。

首先,我想你想要使valueleftChildrightChildparent受保護,而不是私有,以便可以從子類訪問它們。

完成更改后,只需通過定義子類,就可以讓BIntTree.getLeftChild()返回BTree<Integer> ,如下所示:

public class BIntTree extends BTree<Integer> {
    public BTree<Integer> getLeftChild() { return this.leftChild; }
    ...
}

我只想補充一點,如果你在這里發生了一些特定於Integer邏輯,你應該只定義這樣一個類。 否則,將T的類型留給使用BTree類的人是BTree

您可以覆蓋所需的方法,如下所示:

public class BIntTree extends BTree<Integer> {
    @Override
    public BIntTree getLeftChild() { return (BIntTree) super.getLeftChild(); } 
}

從Vertion 1.5開始,Java支持協變返回類型 - 這意味着您可以使用它的子類返回類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM