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
。