3

我有这个通用类

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 方法中声明它可以添加任何类型,只要它是 Type 的子类(在这种情况下为数字),它将被添加到列表中,但我为什么不能?整数不是数字的子类吗?

4

2 回答 2

2

它不会知道是否

<? extends T> 

我认为在 getBranch 和 addBranch 中是相同的。所以它会是

<? extends ? extends T>
于 2012-07-31T01:54:38.830 回答
1

这是因为泛型不是协变的

在您的示例getBranch(0)中可以返回BinTree<? extends Number>(例如BinTree<Integer>or BinTree<Double>),但编译器无法确定将使用的精确泛型类型。因此,出于安全原因,它不允许使用 BinTree< Integer>addBranch以防getBranch(0)返回与BinTree< >不同的东西Integer,例如 BinTree< Double>。

于 2012-07-31T02:11:51.537 回答