Java协变数组错误



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

能够做到这一点听起来很自然,尤其是在语言中没有泛型的早期。只要没有任何变化,所有这些都可以正常工作,而Java没有提供任何机制来保证这一点。

您应该始终支持Lists而不是arrays,因为Lists使用不变的generics

相关内容

  • 没有找到相关文章

最新更新