Java协变数组坏了吗?
有几个人告诉我,Java允许协变数组子类型,换句话说,如果A是B的子类型,那么A[]是B[]的子类型,但这是一个不好的特性,因为它可能导致运行时错误。有人能给我一个具体的例子来说明它是如何导致运行时错误的,以及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
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异常?