我有以下結構。一個父類:
public class MyTree<E extends MyTree<E>>{
List<E> children;
public MyTree(List<E> ls){
this.children = ls;
}
public void insert(E t){
this.children.add(t);
}
}
一個子類:
public class SpecTree<E> extends MyTree<SpecTree<E>>{
private E value;
public SpecTree(E value){
super(new ArrayList<>());
this.value = value;
}
}
現在從主開始,我想將一棵樹插入另一棵樹。
SpecTree<Number> st = new SpecTree<>(0);
st.insert(new SpecTree<Integer>(2)); //incompatible type error
SpecTree必須能夠接受具有當前樹子型別值的新子級。例如,我應該能夠將 a SpecTree<Integer>插入SpecTree<Number>.
是否可以不改變代碼結構而只改變型別引數?
uj5u.com熱心網友回復:
發生錯誤是因為insert期望SpecTree<Number>,但我們正在給它SpecTree<Integer>。
根據PECS,insert將能夠同時服用SpecTree<Number>,SpecTree<Integer>如果已經服用了SpecTree<? extends Number>。整數的生產者是數字的消費者。
這意味著更改E為SpecTree<? extends E>:
public void insert(E t)
所以:
class SpecTree<E> extends MyTree<SpecTree<? extends E>>
但是,現在型別引數SpecTree<? extends E>不符合 中指定的界限MyTree,即E extends MyTree<T>,所以我們也改變它:
class MyTree<E extends MyTree<? extends E>>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474113.html
上一篇:派生物件字典
