[英]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
為任何類型都是安全的。
首先,我想你想要使value
, leftChild
, rightChild
和parent
受保護,而不是私有,以便可以從子類訪問它們。
完成更改后,只需通過定義子類,就可以讓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.