Java泛型不允许我将另一个项添加到列表中

时间:2012-07-31 01:49:18

标签: java generics

我有这个通用类

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?

的子类

2 个答案:

答案 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;。