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