Java通用类型:List 和List 之间的区别


问题内容

Java Generic type:之间有什么区别

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

根据我的理解

(1)List <? extends Number> 是具有超类“ Number”的“未知”数据类型的只读列表。我们只能读取元素,但不能添加

(2)List <T extends Number> 具有超类“ 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时,出现错误。请在这里说明问题是什么?


问题答案:

基本区别是,如果使用,T extends Number则可以引用类型T
list.add((T) new Integer(40));

仿佛在使用? extends Number那样,则 无法 引用该类型,但仍可以说:
((List<Integer>)list).add((int) s);