Почему ClassCastException генерируется только при доступе к возвращаемому значению?
-
13-09-2019 - |
Вопрос
Относится к этот вопрос
Учитывая эту функцию:
public static <S extends CharSequence> S foo(S s) {
return (S) new StringBuilder(s);
}
Почему этот вызов выполняется без исключения:
foo("hello");
Но этот выдает ClassCastException?
System.out.println(foo("hello"));
Решение
Обобщения в Java 5/6 стертый шрифт, что означает, что любой универсальный тип по сути является просто Object
тип (или какой-либо другой тип с наименьшим общим знаменателем, который в данном случае CharSequence
) во время выполнения.Соответствующие гипсовые повязки накладываются там, где это необходимо.Таким образом, ваш метод стирается и выглядит примерно так:
public static CharSequence foo(CharSequence s) {
return (CharSequence) new StringBuilder(s);
}
И ваш вызов стирается до этого:
System.out.println((String)foo("hello"));
Очевидно, Java не будет вставлять (String)
cast, если возвращаемое значение никогда не используется — зачем беспокоиться?
Другие советы
Универсальные типы доступны только компилятору и стираются (по сути, опускаются) во время выполнения.Таким образом, приведение игнорируется внутри метода