Используются ли дженерики для избавления от автоматических апкастов?
Например, если у нас есть класс Super и его потомок Extender, то при добавлении в массив/коллекцию с типом Super экземпляр Extender будет автоматически апкаститься в Super => терять данные и функционал (или нет?). А с дженериком <T extends Super> экземпляры будут сохраняться в исходном виде, так?
Пытался искать, но большинство примеров для меня, увы, размыты.
Ответы (1 шт):
В массиве или коллекции могуть быть элементы только одного типа. Так что они в любом случае будут приводиться к некоему общему типу. Дженерик задает то, к какому именно типу будет приведение. В данном случае с дженериком <T extends Super> коллекция может интерпретироваться и как коллекция из Super и как коллекция из Extender, в зависимости от контекста использования.
Но важно заметить, что экземпляры всё равно будут сохраняться в исходном виде в обоих случаях. Вы можете проверить экземпляр на конкретный тип например так:
Super object = collection.get(i);
if (object instanceof Extender) {
((Extender)object).doSomethingSpecial(); //Приведение типов вниз (downcast)
}