Java协变数组不好?

我有几个人告诉我,如果A是B的子类型,Java允许协变数组子类型,那么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); 

嗯,能够做到这一点听起来很自然,特别是在我们没有使用该语言的generics的早期。 只要没有任何变异,所有这一切都可以正常工作,Java并没有提供任何保证这一点的机制。

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