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 メソッドで、タイプ (この場合は数値) のサブクラスである限り、リストに追加される任意のタイプを追加できると宣言しましたが、どうしてできないのでしょうか? Integer は Number のサブクラスではありませんか?

4

2 に答える 2

2

かどうかはわかりません。

<? extends T> 

getBranch と addBranch は同じだと思います。だからそれはなるでしょう

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

これは、ジェネリックが共変ではないためです。

あなたの例では(たとえばor )getBranch(0)を返すことができますが、コンパイラは使用される正確なジェネリック型について確信が持てません。したがって、安全上の理由から、BinTree< > のような BinTree< > とは異なる何かを返す場合に備えて、BinTree< > の使用は許可れません。BinTree<? extends Number>BinTree<Integer>BinTree<Double>IntegeraddBranchgetBranch(0)IntegerDouble

于 2012-07-31T02:11:51.537 に答える