Java 数组协变

字数 143阅读 84

概念

假设有:

  • 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.

参考

RednaxelaFX - 数组协变带来的静态类型漏洞

推荐阅读更多精彩内容