Java协变数组坏了吗?

Java协变数组坏了吗?,java,arrays,covariance,covariant,Java,Arrays,Covariance,Covariant,有几个人告诉我,Java允许协变数组子类型,换句话说,如果A是B的子类型,那么A[]是B[]的子类型,但这是一个不好的特性,因为它可能导致运行时错误。有人能给我一个具体的例子来说明它是如何导致运行时错误的,以及Java是否/如何解决这个问题的 谢谢大家! 非常简单 String strings[] = {"Broken","Type", "system"}; Object objects[] = strings; objects[0] = 5; // compiles fine, but th

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

谢谢大家!

非常简单

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

objects[0] = 5; // compiles fine, but throws ArrayStoreException at runtime
协变类型并不坏,只要你把东西拿出来,但当你把东西放进去的时候,整个东西就坏了。 假设有一个方法将对象[]作为参数

fn(Object[]a){
...   
}
能用
字符串[]
调用它不是很好吗

 String[] s = {"I","didn't","know","that","this","was","broken"}
 fn(s);
嗯,这样做听起来很自然,特别是在语言中没有泛型的早期。只要没有变异,所有这些都可以正常工作,Java没有提供任何机制来保证这一点


你应该总是喜欢
列表
而不是
数组
,因为
列表
使用的
泛型
是不变的

Java通过引起运行时错误来解决这个问题。真的是这样吗?哇,我希望有一个更好的机制来限制这种情况的发生。出于好奇,你们会做些什么来解决这个问题(除了简单的避免:)?@user98289有。Scala通过强制执行协方差和逆变换的正确用法来解决这个问题。哦,我明白了,是插入导致了这个问题!但在现实生活中,阵列协方差远比不协方差有用。您多久看到一次ArrayStore异常?