2009-09-25 4 views
6

Я статически перекомпилировал Java-библиотеку, которая часто использовала генерические файлы, например Collection<?>, но испускаемая .NET-библиотека DLL использует только Collection, а не с параметрами типа. Как так?Не поддерживает ли IKVM.net дженерики (параметры типа)?

ответ

5

Генераторы Java обрабатываются компилятором Java и в момент компиляции преобразуются в универсальную версию. Это отличается от .NET, где CLR имеет поддержку первого класса для параметров типа. На уровне байт-кода ArrayList<T> будет просто ArrayList.

Цитирую Java docs:

Обобщения реализуются компилятором Java в качестве фронтального преобразования называется стиранием, что процесс перевода или переписывания кода, который использует дженерики в необщего код (то есть сопоставляет новый синтаксис с текущей спецификацией JVM). Другими словами, это преобразование уничтожает всю информацию общего типа; вся информация между угловыми скобками стирается. Например, LinkedList<Integer> станет LinkedList. Использование переменных другого типа заменяется верхней границей переменной типа (например, Object), и когда результирующий код не соответствует правильному типу, вставляется вложенный класс к соответствующему типу.

+4

По этой причине мне не нравятся Java-дженерики. Дженерики должны были быть главной особенностью, но вместо этого это было не намного больше, чем синтаксический сахар, чтобы избежать приведения 'object's к определенному типу. Сахар замечательный, но это могло быть намного больше. Mumble типы, и поэтому действительно добавляют ценность, хотя, так что это не все плохо. – Joren

+1

@ Joren, вы излишне суровы по дженерикам. Хотя стирание стилей, безусловно, неудобно, дженерики, безусловно, являются явным шагом вперед от необходимости отбрасывать из Object, поскольку теперь мы можем иметь все гарантии времени компиляции системы типа Java с нашими обобщенными классами. – Falaina

+3

Но общая информация по-прежнему доступна в файле скомпилированного класса в виде метаданных (иначе 'javac' не сможет проверить генерические файлы). Не может ли IKVM использовать эту информацию? –