Ковариантный массив Java плохой?

Несколько человек сказали мне, что Java допускает подтип ковариантного массива, другими словами, если A является подтипом B, то A[] является подтипом B[], но это плохая функция, потому что она может привести к времени выполнения ошибки. Может ли кто-нибудь дать мне конкретный пример, чтобы проиллюстрировать, как это вызывает ошибки во время выполнения, и как Java решает эту проблему?

Благодарю вас!


person user98289    schedule 17.02.2015    source источник
comment
Java решает эту проблему, путем возникновения ошибок во время выполнения.   -  person Sotirios Delimanolis    schedule 17.02.2015
comment
Это действительно так? Ничего себе, я надеялся, что будет лучший механизм, чтобы ограничить это. Из любопытства, что бы вы, ребята, сделали, чтобы решить эту проблему (кроме того, чтобы просто избежать ее :))?   -  person user98289    schedule 17.02.2015
comment
@ user98289 есть. Scala решает эту проблему, обеспечивая правильное использование ковариантности и контравариантности в компилятор.   -  person Boris the Spider    schedule 17.02.2015


Ответы (1)


Очень простой.

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, которые являются инвариантными.

person Sleiman Jneidi    schedule 17.02.2015
comment
Ооооооооооооооооооооооооооооооооооооооооооа, так что это вызывает проблему! - person user98289; 17.02.2015
comment
Но в реальной жизни ковариация массивов гораздо полезнее, чем нет. Как часто вы видели исключение ArrayStoreException? - person Scott; 07.09.2015