Java协变数组不好?

时间:2015-02-17 20:51:34

标签: java arrays covariance covariant

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

谢谢!

1 个答案:

答案 0 :(得分:4)

很简单。

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不变的{{1}}。