В комментарии постер спрашивает,
Однако, предположительно, компилятор знает,
что так почему он должен иметь
приведение к (T). Есть ли возможный способ
актерский состав может когда-нибудь провалиться?
Это приведение не будет неудачным. Но компилятор предупреждает, что этот код устанавливает бомбу замедленного действия для взрыва где-то еще с помощью ClassCastException
.
В этом примере нет причин использовать дженерики, поскольку ни один из API не использует переменную типа T
. Посмотрите на более реалистичное применение дженериков.
public class GenericsTest<T extends List> {
3 public T foo() {
4 T var = (T) new LinkedList();
5 return var;
6 }
8 public static void main(String... argv) {
9 GenericsTest<ArrayList> gt1 = new GenericsTest<ArrayList>();
10 gt1.foo();
11 System.out.println("Test one okay");
12 ArrayList<?> list = gt1.foo();
13 System.out.println("Test two okay");
14 }
}
A ClassCastException
выбрасывается в строке 12. ClassCastException
, без приведения? Код вызова совершенно корректен. Недопустимое приведение, ошибка, находится в строке 4 в вызываемом методе. Но исключение возникает в какое-то время и в отдаленном месте.
Цель обобщений Java - гарантировать, что код безопасен для типов. Если всего кода было скомпилировано без «непроверенных» предупреждений, гарантия заключается в том, что ClassCastException
не будет поднято во время выполнения. Однако, если библиотека, от которой вы зависите, была написана неправильно, как в этом примере, обещание нарушается.