超级表现奇怪的外卡

时间:2014-03-22 13:11:57

标签: java generics

ArrayList<Number> numbers = new ArrayList<Number>();
 numbers.add(1); 
 numbers.add(2.3);
List<Double> doubles = Arrays.asList(1.2, 3.4, 46.7);
    copy(numbers, doubles);

    public <T> void copy(List<? super T> destination, List<? extends T> source) {
            for (T s : source) {
                destination.add(s); **// this working fine.**
            }
            System.out.println(destination);
        }

以上代码有效。但是下面的代码使用起作用的原因是什么? 下面我清楚地告诉编译器Type是整数类型。

List<? super Integer> superInteger = Arrays.<Integer>asList(1, 2, 3);
        superInteger.add(6); **//this will not give compile time errors but throw unsupportedexception**

1 个答案:

答案 0 :(得分:3)

它与通配符或super关键字无关。 Arrays#asList方法返回固定大小的列表。您无法添加或删除它们。如果要改变列表,则需要创建一个新列表。

List<? super Integer> superInteger = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
superInteger.add(6);   // Now its fine