Ответ 1
T
эффективно стирается во время компиляции. См. здесь:
На язык Java были введены обобщения для обеспечения более жесткого типа проверяет время компиляции и поддерживает универсальное программирование. к реализовать generics, компилятор Java применяет стирание типа к:
- Заменить все параметры типа в родовых типах с их границами или Объект, если параметры типа не ограничены. Произведенный байт-код, поэтому содержит только обычные классы, интерфейсы и методы.
- Вставьте тип при необходимости, чтобы сохранить безопасность типа. генерировать мостиковые методы для сохранения полиморфизма в расширенных общих типах.
- Стирание стилей гарантирует, что новые классы не будут созданы для параметризованных типы; следовательно, дженерики не имеют накладных расходов во время выполнения.
Итак, ваш castToAnotherType
получает T
, стертый в ca. следующее:
public static Object castToAnotherType(Object param) {
Object ret = null;
try {
ret = (Object) param;
} catch (ClassCastException e) {
System.out.print("Exception inside castToAnotherType()");
}
return ret;
}
Что явно не производит ClassCastException
.
main(...)
- это другая история, это приводит к следующему:
public static void main(String[] args) {
try {
String obj = (String) MyClass.castToAnotherType(new Object());
} catch (ClassCastException e) {
System.out.print("Exception outside castToAnotherType()");
}
}
Что создает ClassCastException
при попытке применить Object
к String
.
Пожалуйста, просмотрите Тип Erasure в учебнике Generics.