Java协变数组不好吗?

标签 java arrays covariance covariant

有人告诉我,Java 允许协变数组子类型化,换句话说,如果 A 是 B 的子类型,那么 A[] 是 B[] 的子类型,但这是一个不好的特性,因为它可以导致运行时错误。谁能给我一个具体的例子来说明它是如何导致运行时错误的,以及 Java 是否/如何解决这个问题?

最佳答案

非常简单。

String strings[] = {"Broken","Type", "system"};
Object objects[] = strings;

objects[0] = 5; // compiles fine, but throws ArrayStoreException at runtime

只要你把东西拿出来,协变类型还不错,但是当你把东西放进去的时候,整个东西就坏了。 假设您有一个方法将 Object[] 作为参数。

fn(Object[]a){
...   
}

如果能够用 String[] 调用它不是很好吗?

 String[] s = {"I","didn't","know","that","this","was","broken"}
 fn(s);

嗯,这听起来很自然,尤其是在我们语言中没有泛型的早期。只要没有任何变化,所有这些都可以正常工作,而 Java 不提供任何机制来保证这一点。

你应该总是喜欢 Lists 而不是 arrays,因为 Lists 使用不变的 generics

关于Java协变数组不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28570877/

相关文章:

java - 设计助手/实用程序类 - java

java - 如何使 ArrayList 在 java 中用作二维数组?

python - 需要返回协方差的 Python 多项式拟合函数

c# - 为什么 C#/CLR 不支持方法重写协方差/反方差?

java - Java3D:逐步旋转Universe

java - 正确滚动到 JTable 的选定行

Java目录错误

ios - 从 Swift 中的 JSON 对象解析多个数组

javascript - 使用 Javascript 将数组项相乘

scala - 为什么 Scala 的不可变 Set 在其类型上不是协变的?