Почему параметры универсального типа Java не изменяются во время выполнения? - PullRequest
6 голосов
/ 17 декабря 2008

Насколько я понимаю, C # и java отличаются по отношению к универсальным параметрам в некоторых отношениях, одним из которых является то, что параметры универсального типа доступны во время выполнения в C # /. NET, но не в Java. Почему дизайнеры языка Java сделали это так?

Ответы [ 2 ]

9 голосов
/ 17 декабря 2008

Чтобы разрешить двоичную совместимость с предварительным универсальным байт-кодом, поэтому новый код может взаимодействовать со старым кодом.

Со страницы Type Erasure Учебников Java:

Стирание типа включает приложения Java которые используют дженерики для поддержания двоичного совместимость с библиотеками Java и приложения, которые были созданы ранее дженерики.

[...]

Тип стирания существует, так что новый код может продолжать взаимодействовать с наследием код.

По вопросу, связанному с этим, взгляните на C # против обобщений Java .

4 голосов
/ 17 декабря 2008

Я помню, что читал что-то об этом в книге Hardcore Java:

Проблема с проверкой элементов в коллекция во время выполнения является то, что это чрезвычайно дорогой; получатель чего-то эффективность только O (n). Если у вас есть только 10 адресов в вашей коллекции, проверить элементы легко. Однако если Коллекция содержит 15 000 адреса, то вы бы понесли значительные накладные расходы, когда кто-то вызывает сеттер.

С другой стороны, если вы можете запретить пользователям размещать что-нибудь кроме адреса в вашем сбор во время компиляции, то вы не нужно проверять типы в во время выполнения. Если они попытаются дать вам то, что не является адресом, то компилятор отклонит попытку. Это именно то, что параметризовано типы делают.

Однако на вопросы «почему» никогда нельзя дать удовлетворительный ответ, потому что слишком много переменных связано с людьми, временем, местом и политикой. Я помню, как читал где-то еще, что решение было во многом связано с поддержанием совместимости с тем, как все уже делалось в байт-коде Java. Вот еще одна цитата из этой же книги:

После того, как компилятор разрешил безопасность типов, введенную обобщениями, он удаляет параметризацию из типа. Поэтому информация недоступна во время выполнения. Как утверждает Sun, цель удаления - позволить библиотекам классов, созданным на основе более старой версии JDK, работать на виртуальной машине JDK 1.5.

Мне любопытно, каковы преимущества дженериков времени выполнения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...