Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通用通配符协方差和arraylist加法函数行为_Java_Generics - Fatal编程技术网

Java 通用通配符协方差和arraylist加法函数行为

Java 通用通配符协方差和arraylist加法函数行为,java,generics,Java,Generics,等边三角形是三角形的一个子类型 List<? super EquilateralTriangle> equilateralTriangle = new ArrayList<Triangle>(Arrays.asList(new Triangle(), new Triangle())); equilateralTriangle.add(new Triangle()); // doesn't work equilateralTriangl

等边三角形
三角形
的一个子类型

List<? super EquilateralTriangle> equilateralTriangle =
        new ArrayList<Triangle>(Arrays.asList(new Triangle(), new Triangle()));
equilateralTriangle.add(new Triangle());            // doesn't work
equilateralTriangle.add(new EquilateralTriangle()); // works

List看看下面的语句。显然,添加字符串是有效的,而添加对象会导致编译时错误

List<String> items = ...;
items.add(new String()); // works
items.add(new Object()); // error
列表项=。。。;
items.add(新字符串());//作品
items.add(新对象());//错误
现在,让我们使用通配符,如您的问题所示:

List<? super String> items = ...;
List解释了逆变部分。我只想回答这个问题:

List<? super String> items = ...;
为什么编译器在第二行抱怨?我插入的值与在实例化arraylist时定义的类型参数中定义的值相同

关于此代码,我可以问您同样的问题:

Object object = new ArrayList<Triangle>();
object.add(new Triangle());
Object Object=newarraylist();
添加(新三角形());
为什么这样不行?编译器难道不知道
对象
数组列表


答案是否定的。对于编译器来说,实例化了什么类型并不重要。重要的是您调用的变量的类型。

add方法的参数处于逆变位置,我认为这就是它不起作用的原因。还有其他几个。分配列表类型后,无法将其添加到该列表类型中<代码>?
表示未知。你正在添加到第1行的已知列表中。嗨,布莱恩,如果是ListThank Brain,这是真的,我想我知道了。它之所以有效,是因为您正在添加三角形,它是等边三角形的超级类型。但编译器如何知道哪个超类型。但正如你定义的那样?超级等边三角形,这意味着编译器非常确定,正如您在声明类型参数中定义的。谢谢您的评论。