Статическая информация общего типа для полей и методов должна присутствовать в скомпилированном файле класса, чтобы при компиляции другого исходного кода компилятор мог выполнять проверку типов. Например, когда вы пишете код, который использует переменную типа ArrayList
, и вызываете для нее метод get ()
, у вас нет исходного кода для Класс ArrayList
. Компилятор просматривает скомпилированный файл класса и получает общий тип возврата метода get ()
и понимает, что он возвращает общий тип E
, так что он может выполнять проверка типов. Таким образом, информация об общем типе должна присутствовать, чтобы компилятор мог ее проверить.
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?
Когда вы имеете дело с банкой скомпилированного байт-кода в вашей среде IDE, вы все равно можете получить универсальное автозаполнение. Вот как это реализовано. В общем, вы правы: типы стираются не полностью.