Java泛型:在arraylist(无界通配符类型)上,add和addAll方法的行为不同

Java泛型:在arraylist(无界通配符类型)上,add和addAll方法的行为不同,java,generics,Java,Generics,直接来说,这里有一个例子: ArrayList <?> x = new ArrayList(); ArrayList y = new ArrayList(); x.add("abc"); // Clause 1. Compilation error - No problemo. Understood. x.addAll(y); // Clause 2. No compilation error ArrayList x=new ArrayList();

直接来说,这里有一个例子:

    ArrayList <?> x = new ArrayList();
    ArrayList y = new ArrayList();
    x.add("abc"); // Clause 1. Compilation error - No problemo. Understood.
    x.addAll(y); // Clause 2. No compilation error
ArrayList x=new ArrayList();
ArrayList y=新的ArrayList();
x、 添加(“abc”);//第1条。编译错误-没有问题。理解。
x、 addAll(y);//第2条。没有编译错误

对于无界通配符,不能添加。为什么最后一条语句没有编译错误?

因为您正在使用原始类型调用该方法。编译器无法执行类型检查。如果您使用
y
用户泛型,
addAll(..)
将失败。

确定。我明白了。第1条将失败-因为类型是已知的,并且它遵循无边界通配符阻止添加的一般规则。第2条,因为type元素是未知的,所以它使用混合遗留代码和泛型代码的一般规则。我做得对吗?是的-对于原始类型,所有泛型内容都被丢弃。@yapkm01泛型在语言中添加得较晚,因此它们的设计方式必须允许与大量现有的非泛型库轻松交互,因此编译器在存在原始类型时忽略泛型。