27

Javaジェネリック型:違いは何ですか

(1) List <? extends Number>   
(2) List <T extends Number>

私の理解によると

(1)List <? extends Number> は、スーパー クラス "Number" を持つ "unknown" データ型の読み取り専用リストです。要素を読み取ることはできますが、追加することはできません

(2)List <T extends Number> スーパークラス「数値」のデータ型一覧。要素を読み取ってリストに追加できます

以下のコード例をご覧ください

class TestGen{

    public static void main(String[] args) {
        double result = 0.0;

        List<Integer> intList = new ArrayList<Integer>();
        intList.add(10);
        intList.add(20);
        intList.add(30);

        result = TestGen.sumOfList1(intList);
        System.out.println("Result=" + result);
        result = TestGen.sumOfList2(intList);
        System.out.println("Result=" + result);
    }

    public static double sumOfList1(List<? extends Number> list) {
        double s = 0.0;
        for (Number n : list)
            s += n.doubleValue();
        return s;
    }

    public static <T extends Number> double sumOfList2(List<T> list) {
        double s = 0.0;

        // getting error while trying to add new element 
        // list<T> is not applicable for argument(Integer) : Why ?
        list.add(new Integer(40));

        for (Number n : list)
            s += n.doubleValue();

        return s;
    }
}

Integer (または Number オブジェクト) を sumOfList2 に追加しようとすると、エラーが発生します。ここで何が間違っているのか説明してください。

4

5 に答える 5

1

ではsumOfList2Tは の特定のサブクラスですがNumber、それらのいずれでもかまいません。たとえば、であるT可能性があり、 を に追加するBigDecimalことはできません。IntegerList<BigDecimal>

リストに任意のタイプの数値を追加できるようにする場合は、次のようにする必要がありますList<Number>

public static double sumOfList2(List<Number> list) {...}
于 2013-08-12T12:46:10.897 に答える
0

1)

List <? extends Number> 

使用するのが適切でしょう

List<Integer> list = Arrays.asList(0,1,2,3,4);

エラーは発生しません。

List <Double> list = Arrays.asList(0.0,0.1,0.2,0.3,0.4);

次に、それを追加できます

result = TestGen.sumOfList1(list);

2) リスト

List<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1); Would do the job.
于 2020-05-25T06:52:02.240 に答える