我有这个通用类
public class BinTree<T> {
T value;
List<BinTree<? extends T>> branch = new ArrayList<BinTree<? extends T>>();
public BinTree(T v){ value = v;}
public void addBranch(BinTree<? extends T> tree){
if(branch.size() == 2){
System.out.println("You can only have two childs");
}else{
branch.add(tree);
}
}
public BinTree<? extends T> getBranch(int n){ return branch.get(n);}
}
它的实施在这里
public static void main(String[] args){
BinTree<Number> firstBinTree = new BinTree<Number>(0);
firstBinTree.addBranch(new BinTree<Integer>(5));
firstBinTree.addBranch(new BinTree<Double>(6.5));
Number o = firstBinTree.getBranch(0).value;
firstBinTree.getBranch(0).addBranch(new BinTree<Integer>(6));
}
但这一行
firstBinTree.getBranch(0).addBranch(new BinTree<Integer>(6));
不允许我添加另一个BinTree类型整数。这是为什么?我在我的addBranch方法中声明它可以添加任何类型,只要它是类型的子类(在这种情况下是数字),它将被添加到列表中但是我怎么能这样做? isn&t; t整数是否为Number?
的子类答案 0 :(得分:2)
它不知道是否
<? extends T>
我认为getBranch和addBranch中的是一样的。所以它将是
<? extends ? extends T>
答案 1 :(得分:1)
这是因为generics are not covariant。
在您的示例中,getBranch(0)
可以返回BinTree<? extends Number>
(例如BinTree<Integer>
或BinTree<Double>
),但编译器无法确定将使用的精确泛型类型。因此,出于安全原因,它将不允许使用BinTree&lt; Integer
&gt;如果addBranch
getBranch(0)
将返回 不同的内容 ,则BinTree&lt; Integer
&gt;比如BinTree&lt; Double
&gt;。