Java covariant array bad?

前端 未结 1 916
孤独总比滥情好
孤独总比滥情好 2021-01-14 02:49

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 feat

1条回答
  •  被撕碎了的回忆
    2021-01-14 03:30

    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.

    0 讨论(0)
提交回复
热议问题