美文网首页
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中的数组是协变的,但是泛型不支持协变。 数组的协变 首先了解下什么是数组的协变,看下面的...

  • JAVA泛型与类型安全

    1. 基础泛型 2. 协变与逆变与不变 协变 简单来说即: Java中的数组是协变的 逆变与协变相对,逆转了类型关...

  • Java 数组协变

    概念 假设有: A[] B[] class B extends A 那么A[]的引用可以指向B[]的实例, 即以下...

  • java 不变、协变、逆变

    java 不变、协变、逆变 前言 先说结论,java 的 List 是不变的,java 的 array 是协变的。...

  • 14.从底层实现剖析Kotlin协变与逆变的原理

    1.Java与Kotin的协变对比 Kotlin: 声明处协变; Java:使用处协变。Kotlin中的out关键...

  • 泛型通配符详解——?

    为什么要用通配符呢? 在java中,数组是可以协变的,比如dog extends Animal,那么Animal[...

  • Java逆变与协变

    引子 《Effective Java》中第25条中《列表优于数组》中提到数组是协变的,相反泛型是不可变的 其实用于...

  • Java泛型的理解

    泛型的erasure 数组是协变的

  • Swift数组不具备协变特性

    标题就是结论,牢记! Swift数组不具备协变特性,OC数组也不具备协变特性 《Swift进阶》一书中提到Swif...

  • Kotlin 泛型中的 in 和 out

    协变 在 Java 的泛型系统中. 泛型默认是不支持协变(covariant). 也就是说在 Java 中. 即使...

网友评论

      本文标题:Java 数组协变

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