По существу, тип в приведении может не содержать <…>
, если это не <?>
. (Есть исключения из этого правила, но они угловые случаи, и здесь они не имеют отношения.)
Обобщения являются механизмом проверки типов во время компиляции. Во время выполнения класс MyList<MyObjectA>
не существует из-за стирания типа. Существует только один MyList
класс.
Это означает, что компилятор может генерировать только этот код:
(MyList<?>) doSomething();
Попытка заставить компилятор предположить, что результат имеет спецификацию c generi c тип небезопасен, , потому что код, который будет выполнять приведение, не может проверить это. Таким образом, ваш актерский состав является неконтролируемым.
безопасный способ сделать это - выполнить нестандартные c касты:
MyList<MyObjectA> var = new MyList<>();
MyList<?> list = (MyList<?>) doSomething();
for (Object element : list) {
var.add((MyObjectA) element);
}
Внимание: var
теперь является зарезервированным ключевым словом в Java. Вы должны избегать использования его в качестве имени переменной.