стирание типа Java по сравнению с Field#getGenericType и Method#getGenericReturnType

Указатель на другой указатель

10
задан Landon Kuhn 28 May 2009 в 23:05
поделиться

3 ответа

Статическая информация общего типа для полей и методов должна присутствовать в скомпилированном файле класса, чтобы при компиляции другого исходного кода компилятор мог выполнять проверку типов. Например, когда вы пишете код, который использует переменную типа ArrayList , и вызываете для нее метод get () , у вас нет исходного кода для Класс ArrayList . Компилятор просматривает скомпилированный файл класса и получает общий тип возврата метода get () и понимает, что он возвращает общий тип E , так что он может выполнять проверка типов. Таким образом, информация об общем типе должна присутствовать, чтобы компилятор мог ее проверить.

3
ответ дан 3 December 2019 в 23:14
поделиться

The just runtime types of objects are erased. For instance:

Object obj = new ArrayList<String>();

obj.getClass() will return ArrayList.class. You can even tell that ArrayList has a generic parameter. But there is no way to tell if obj was created as ArrayList, ArrayList, ArrayList, ArrayList (raw), or anything else.

Static type information is still there for class, methods, etc (although not for locals). This is just an extra bit of data appended as attributes in the class file, and available at runtime. Think of it much the same as annotations with runtime retention. Was there a question?

7
ответ дан 3 December 2019 в 23:14
поделиться

Когда вы имеете дело с банкой скомпилированного байт-кода в вашей среде IDE, вы все равно можете получить универсальное автозаполнение. Вот как это реализовано. В общем, вы правы: типы стираются не полностью.

4
ответ дан 3 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: