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?
Java covariant array bad?
Asked Answered
Java addresses the problem by causing runtime errors. –
Impolite
Is that really it? Wow, I was hoping that there would be a better mechanism to limit this from happening. Out of curiosity what would you guys do to fix this problem (besides simple avoid it :) )? –
Intent
@Intent there is. Scala solves it by enforcing correct usage of covariance and contravariance in the compiler. –
Hoebart
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.
Ooohhhh I see so it's inserting that causes the problem! –
Intent
But in real life array covariance is far far more useful than not. How often have you seen an ArrayStoreException? –
As
© 2022 - 2024 — McMap. All rights reserved.