java - 为什么字符串数组可以分配给对象数组,但字符串数组列表不能分配给对象数组列表?

标签 java generics arraylist

为什么在java中像第3行这样的东西是允许的,而第6行是不允许的?

Object[] object= new Object[100];
String[] string= new String[100];
object=string; //line #3
List<Object> objectList = new ArrayList<>();
List<String> stringList = new ArrayList<>();
objectList=stringList;// line #6 [Error: Type mismatch: cannot convert from List<String> to List<Object>]

最佳答案

这是因为数组是协变的并且 String[]Object[] 的子类型,因此分配 object = string;是合法的。但如果你这样做怎么办:

object[0] = 1;

该语句可以正常编译,但是当您运行它时,您会收到此错误。

java.lang.ArrayStoreException: java.lang.Integer

相反,参数化类型是不变的。所以,List<String>既不是 List<Object> 的子类型,也不是父类(super class)型并且您的编译器开始在赋值位置 objectList = stringList; 提示。但是,如果需要使参数化类型协变,同时保持类型安全,则可以使用通配符。例如,这编译得很好。

List<?> objectList = new ArrayList<>();
List<String> stringList = new ArrayList<>();
objectList = stringList;

关于java - 为什么字符串数组可以分配给对象数组,但字符串数组列表不能分配给对象数组列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60944410/

相关文章:

java - JsonpRequestBuilder访问google网页超时异常

generics - 这个泛型类型约束在 Swift 中意味着什么?

java - 将通用服务与其实现和子类型绑定(bind)

java - 具有类型绑定(bind)的嵌套泛型导致编译错误

java - 将字符串数组转换为数组列表?

使用数组和 while 循环对询问的数字进行 Java 索引

java - 处理 Jersey WS 超时

Java函数查找素数不起作用

java - 它写入列表的第一条记录或最后一条记录,任何正确的建议

javacc - 解析树+结果