В случае массивов можно сказать Animal[] animals = new Cat[10];
Почему так много разборчивых правил о дженериках Java?
Но, используя общий синтаксис, мы не можем сказать, List<Animal> is a
ArrayList<Cat>
.
List<Animal>
может ссылаться на любую полиморфную базовую коллекцию только животных и ничего другого ради безопасности типов.
public void foo() {
Cat[] cats = {new Cat(), new Cat()};
addAnimals(cats);
}
public void addAnimal(Animal[] animals) {
animals[0] = new Dog(); // No compile time error. But ArrayStoreException
// at runtime as the JVM knows the type of animals.
}
Если бы генерик были неявно полиморфными, в худшем случае, даже если мы добавим неправильный элемент в коллекцию и сделать некоторые вещи, похожие на тот, как в приведенной выше коде, в лучшем случае мы получим ClassCastException
(или какое-либо другое исключение), который также останавливает поток программы, например ArrayStoreException
?
Я читал, что в случае дженериков из-за стирания типа JVM ничего не знает о типе коллекции и, следовательно, не может генерировать исключение, например ArrayStoreException
.
Мой вопрос: почему это много времени защиты времени в случае typed
коллекций? Почему так много разборчивых правил с дженериками? Пожалуйста, предоставьте правильное понимание.
Является ли ваше животное абстрактным классом или интерфейсом? – OrhanC1
Потому что, ну, тип безопасности повышает надежность, а Java - это язык, безопасный для типов. Вы можете использовать JavaScript, Groovy или любой другой динамический язык, если вы предпочитаете менее безопасные для использования языки. В Java мы предпочитаем не иметь собак в «List». –
Потому что лучше ловить ошибки во время компиляции, а не пропускать их во время выполнения. – anonymous