为什么在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/