概念
假设有:
- A[]
- B[]
- class B extends A
那么A[]的引用可以指向B[]的实例, 即以下代码是合法的.
Object[] objs;
Integer[] integers = new Integer[10];
objs = integers;
注意, 如果换成泛型类, 比如说List<Object>
, 和List<Integer>
, 那两者就不能这样赋值了, 因为Java泛型不是协变的.
数组协变的一些隐患
Object[] objs;
Integer[] integers = new Integer[10];
objs = integers;
objs[0] = "String"; // Exception in thread "main" java.lang.ArrayStoreException: java.lang.String
以上代码是可以通过编译的, 也不会有任何警告, 但是一旦运行到objs[0] = "String";
的时候就会抛出异常java.lang.ArrayStoreException: java.lang.String
.
网友评论