В отличие от .NET Java generics реализуются методом, называемым стиранием типа.
. Это означает, что компилятор будет использовать информацию о типе при создании файлов классов, но не передавать это информацию в байтовый код. Если вы посмотрите на скомпилированные классы с помощью javap или аналогичных инструментов, вы обнаружите, что List<String>
является простым List
(Object
) в файле класса, как это было в коде pre-Java-5.
. Кодирование, получающее общий список, будет «перезаписано» компилятором, чтобы включить в него броски, которые вам придется писать в более ранних версиях. По сути, следующие два фрагмента кода идентичны с точки зрения байтового кода после компилятора с ними:
Java 5:
List<String> stringList = new ArrayList<String>();
stringList.add("Hello World");
String hw = stringList.get(0);
Java 1.4 и до:
List stringList = new ArrayList();
stringList.add("Hello World");
String hw = (String)stringList.get(0);
При чтении значений из общего класса в Java 5 автоматически добавляется необходимый приведение к объявленному параметру типа. При вставке компилятор проверяет значение, которое вы пытаетесь ввести и прервите с ошибкой, если это не строка.
Все дело в том, чтобы сохранить старые библиотеки и новый расширенный код в интероперабельности без какой-либо необходимости перекомпилировать существующие библиотеки. Это основное преимущество над способом .NET, когда родовые классы и не общие игры живут бок о бок, но не могут быть взаимозаменяемы.
Оба подхода имеют свои плюсы и минусы, но так оно и есть находится в Java.
Чтобы вернуться к исходному вопросу: вы не сможете получить информацию о типе во время выполнения, потому что его просто больше нет, как только компилятор выполнил свою работу. Это, безусловно, ограничивает в некотором роде и есть некоторые капризные способы вокруг него, которые обычно основаны на хранении экземпляра класса где-то, но это не стандартная функция.