Знаете, как это делает CLR. Кто-нибудь даже признает отсутствие общей информации о времени выполнения, является проблемой и работает над ее решением?Есть ли планы по JVM для поддержки дженериков во время выполнения?
ответ
Дизайнеры Java решили использовать это решение для обеспечения обратной совместимости (на уровне байт-кода). С тех пор есть еще больше Java-кода, поэтому нарушение обратной совместимости будет иметь все более серьезные последствия. Поэтому я сомневаюсь, что они передумали об этом.
Они упомянули, что они хотели бы сделать это в будущем, если это возможно, и aioobe упоминает, что может быть способ сделать это, не нарушая обратной совместимости, поэтому ... Я не думаю, что это можно исключить. – ColinD
@ColinD, конечно же, ничего нельзя исключить :-) Обратите внимание, что цитата @ aioobe предлагает тип reification как функцию _optional_ (предположительно только для нового кода). –
@Peter CLR не испытывает проблем с обратной совместимостью, когда в .NET 2.0 были реализованы обобщения ... что делает JVM более проблематичным в этом отношении? –
Почему это проблема (из комментариев к вашему вопросу)
Ну, рассмотрим, например, что не может перегрузить метод так:
void foo(List<String> strings) { ... }
void foo(List<Integer> ints) { ... }
даже хотя имеет смысл фактически разрешить это. (Основная причина, почему это не работает сегодня, потому что это будет, когда компилируется в байткод, выглядят как foo(List strings)
и foo(List ints)
.)
Существуют ли какие-либо планы на JVM для поддержки дженерики во время выполнения?
По this page это по крайней мере не в трубопроводе для Java 7:
реифицированных Дженерик
В настоящее время дженерик реализованы с использованием стиранию, что означает, что общая информация типа недоступна во время выполнения, что затрудняет запись какого-либо кода. Эти средства были реализованы таким образом, чтобы поддерживать обратную совместимость со старым нестандартным кодом. Обоснованные генерические файлы будут предоставлять информацию об общем типе во время выполнения, что приведет к потере устаревшего не общего кода. Тем не менее, Нил Гафтер предложил сделать типы повторно доступными только в том случае, если они указаны, чтобы не нарушить обратную совместимость.
Ссылки
Я считаю, что кто-то (возможно, Марк Рейнгольд) сказал на JavaOne в этом году, что они могут попытаться материализовать дженерики в Java в будущее. Конечно, это было бы не раньше, чем Java 9, и это было бы огромным изменением, когда было разработано много потенциальных проблем.
Проблема может быть частично решена без JVM изменений: В Scala (работаем и на JVM) можно добавить так называемые Manifests которые держат информацию о типе времени выполнения для общих параметров. Я думаю, что это решение может быть адаптировано для Java без особых проблем. Это не идеально, но, вероятно, намного проще реализовать как «реальную вещь».
- 1. Настройка размера кучи JVM во время выполнения
- 2. Получение памяти, доступной JVM во время выполнения
- 3. Настройка параметров JVM во время выполнения
- 4. Изменение параметров JVM во время выполнения
- 5. Проверка наличия поддержки SSE во время выполнения
- 6. Изменение параметров JVM JIT во время выполнения
- 7. Будет ли расширяться JVM для обработки дженериков?
- 8. Определить переведенный тип для дженериков во время выполнения
- 9. Планы для Sharepoint для поддержки MVC?
- 10. JavaScript: Есть ли планы по внедрению потоков в будущей версии?
- 11. планы выполнения Базы данных
- 12. Есть ли способ ограничить использование ЦП процентом во время выполнения для JVM или Dalvik?
- 13. Как проверить, есть ли во время выполнения или время разработки?
- 14. Есть ли редактор столбцов Listview для использования во время выполнения?
- 15. Использование дженериков во время проверки
- 16. Код iOS для идентификации поддержки металла во время выполнения?
- 17. Как проверить библиотеку поддержки/версию библиотеки AppCompat во время выполнения?
- 18. Java: Могу ли я внедрить исключение во время выполнения во произвольный метод класса во время выполнения?
- 19. Может ли переменная изменяться во время выполнения?
- 20. jackson: как размонтировать класс с использованием дженериков во время выполнения?
- 21. Есть ли способ фильтровать планы выполнения sql конкретным оператором?
- 22. Есть ли способ установить значение #define во время выполнения?
- 23. Есть ли способ получить метаданные DefaultProperty во время выполнения?
- 24. Есть ли способ создать новый тип во время выполнения?
- 25. OCaml для JVM. Есть ли?
- 26. Есть ли способ повлиять на местных жителей во время выполнения?
- 27. Определение местоположения исполняемого файла JVM во время выполнения
- 28. Отобразить поток ThreadStackSize JVM во время выполнения приложения
- 29. Есть ли способ определить доступное пространство стека во время выполнения?
- 30. Есть ли у CSS какие-либо планы по поддержке переменных?
Почему это проблема? – hvgotcodes
@hvgotcodes: не может использоваться с примитивами, без повышения эффективности, не может использоваться с отражением, более низкой степенью безопасности и многими, многими угловыми шкафами. –
@hvgotcodes: Это не большая проблема, как правило, в повседневной разработке, но это, конечно же, усложняет работу некоторых типов библиотек и поэтому действительно нужно иметь возможность получить такую информацию во время выполнения. Например, возьмите Guice, который должен работать вокруг отсутствия информации о типе с такими вещами, как 'TypeLiteral' и трюки подтипов. Существуют и другие типы библиотек, которые бы выиграли аналогичным образом. – ColinD