Java covariant array bad?

≯℡__Kan透↙ 提交于 2019-12-30 10:33:12

问题


I've been told by several people that Java allows covariant array subtyping in other words if A is a subtype of B, then A[] is a subtype of B[], but that this is a bad feature because it can lead to runtime errors. Can someone give me a concrete example to illustrate how it causes runtime errors and if/how does Java address this problem?

Thank you!


回答1:


Very simple.

String strings[] = {"Broken","Type", "system"};
Object objects[] = strings;

objects[0] = 5; // compiles fine, but throws ArrayStoreException at runtime

Covariant types are not bad as long as you as you take things out, but the moment you put things in, the whole thing breaks. Imagine you have a method takes an Object[] as a parameter.

fn(Object[]a){
...   
}

wouldn't it be nice to be able to call it with a String[]?

 String[] s = {"I","didn't","know","that","this","was","broken"}
 fn(s);

Well, it sounds natural to be able to do so, especially in the early days when we didn't have generics in the language. And all this works fine as long as nothing get mutated, and Java doesn't provide any mechanism to guarantee that.

You should always favour Lists over arrays, because Lists use generics which are invariant.



来源:https://stackoverflow.com/questions/28570877/java-covariant-array-bad

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!