Почему ClassCastException генерируется только при доступе к возвращаемому значению?

StackOverflow https://stackoverflow.com/questions/1268623

  •  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, если возвращаемое значение никогда не используется — зачем беспокоиться?

Другие советы

Универсальные типы доступны только компилятору и стираются (по сути, опускаются) во время выполнения.Таким образом, приведение игнорируется внутри метода

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top