Используются ли дженерики для избавления от автоматических апкастов?

Например, если у нас есть класс Super и его потомок Extender, то при добавлении в массив/коллекцию с типом Super экземпляр Extender будет автоматически апкаститься в Super => терять данные и функционал (или нет?). А с дженериком <T extends Super> экземпляры будут сохраняться в исходном виде, так? Пытался искать, но большинство примеров для меня, увы, размыты.


Ответы (1 шт):

Автор решения: user1715296

В массиве или коллекции могуть быть элементы только одного типа. Так что они в любом случае будут приводиться к некоему общему типу. Дженерик задает то, к какому именно типу будет приведение. В данном случае с дженериком <T extends Super> коллекция может интерпретироваться и как коллекция из Super и как коллекция из Extender, в зависимости от контекста использования. Но важно заметить, что экземпляры всё равно будут сохраняться в исходном виде в обоих случаях. Вы можете проверить экземпляр на конкретный тип например так:

Super object = collection.get(i);
if (object instanceof Extender) {
    ((Extender)object).doSomethingSpecial(); //Приведение типов вниз (downcast)
}
→ Ссылка