Java 协变数组不好?
Java covariant array bad?
有人告诉我 Java 允许协变数组子类型化,换句话说,如果 A 是 B 的子类型,那么 A[] 是 B[] 的子类型,但这是一个不好的特性,因为它会导致运行时错误。谁能给我一个具体的例子来说明它是如何导致运行时错误的,if/how 是否 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);
嗯,能够这样做听起来很自然,尤其是在早期我们的语言中没有泛型的时候。只要没有任何变化,所有这些都可以正常工作,并且 Java 不提供任何机制来保证这一点。
你应该总是喜欢 Lists
而不是 arrays
,因为 Lists
使用不变的 generics
。
有人告诉我 Java 允许协变数组子类型化,换句话说,如果 A 是 B 的子类型,那么 A[] 是 B[] 的子类型,但这是一个不好的特性,因为它会导致运行时错误。谁能给我一个具体的例子来说明它是如何导致运行时错误的,if/how 是否 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);
嗯,能够这样做听起来很自然,尤其是在早期我们的语言中没有泛型的时候。只要没有任何变化,所有这些都可以正常工作,并且 Java 不提供任何机制来保证这一点。
你应该总是喜欢 Lists
而不是 arrays
,因为 Lists
使用不变的 generics
。