java - super 行为异常的通配符

标签 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 是 Integer 类型。

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

最佳答案

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

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

关于java - super 行为异常的通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22578065/

相关文章:

java - 如何创建多个级别的子类,以便参数属于子类?

java - EJB 3.x onMessage() 与@Timeout 事务上下文

java - 如何在 Jericho 的两条评论之间进行解析?

java - 将类似的方法重构为 Java 中的泛型方法

java - 在 switch 语句中使用 java.lang.Class<?>

java - 事实上,泛型类的原始类型可以采用该泛型类的所有不同变体,这与 Java 兼容性有关吗?

Java:评估后缀表达式

Javafx 选择多行

java - 对于不同类型的数据,我应该使用哪个 Map 类?

c# - 在 ASP.NET Core 依赖注入(inject)中使用非泛型实现注册泛型接口(interface)