美文网首页
Java 数组协变

Java 数组协变

作者: xiaofudeng | 来源:发表于2017-11-05 19:56 被阅读0次

    概念

    假设有:

    • 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 - 数组协变带来的静态类型漏洞

    相关文章

      网友评论

          本文标题:Java 数组协变

          本文链接:https://www.haomeiwen.com/subject/ymyhmxtx.html