2010-10-22 4 views
7

Знаете, как это делает CLR. Кто-нибудь даже признает отсутствие общей информации о времени выполнения, является проблемой и работает над ее решением?Есть ли планы по JVM для поддержки дженериков во время выполнения?

+4

Почему это проблема? – hvgotcodes

+3

@hvgotcodes: не может использоваться с примитивами, без повышения эффективности, не может использоваться с отражением, более низкой степенью безопасности и многими, многими угловыми шкафами. –

+2

@hvgotcodes: Это не большая проблема, как правило, в повседневной разработке, но это, конечно же, усложняет работу некоторых типов библиотек и поэтому действительно нужно иметь возможность получить такую ​​информацию во время выполнения. Например, возьмите Guice, который должен работать вокруг отсутствия информации о типе с такими вещами, как 'TypeLiteral' и трюки подтипов. Существуют и другие типы библиотек, которые бы выиграли аналогичным образом. – ColinD

ответ

3

Дизайнеры Java решили использовать это решение для обеспечения обратной совместимости (на уровне байт-кода). С тех пор есть еще больше Java-кода, поэтому нарушение обратной совместимости будет иметь все более серьезные последствия. Поэтому я сомневаюсь, что они передумали об этом.

+1

Они упомянули, что они хотели бы сделать это в будущем, если это возможно, и aioobe упоминает, что может быть способ сделать это, не нарушая обратной совместимости, поэтому ... Я не думаю, что это можно исключить. – ColinD

+0

@ColinD, конечно же, ничего нельзя исключить :-) Обратите внимание, что цитата @ aioobe предлагает тип reification как функцию _optional_ (предположительно только для нового кода). –

+0

@Peter CLR не испытывает проблем с обратной совместимостью, когда в .NET 2.0 были реализованы обобщения ... что делает JVM более проблематичным в этом отношении? –

2

Почему это проблема (из комментариев к вашему вопросу)

Ну, рассмотрим, например, что не может перегрузить метод так:

void foo(List<String> strings) { ... } 
void foo(List<Integer> ints) { ... } 

даже хотя имеет смысл фактически разрешить это. (Основная причина, почему это не работает сегодня, потому что это будет, когда компилируется в байткод, выглядят как foo(List strings) и foo(List ints).)

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

По this page это по крайней мере не в трубопроводе для Java 7:

реифицированных Дженерик

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

Ссылки

1

Я считаю, что кто-то (возможно, Марк Рейнгольд) сказал на JavaOne в этом году, что они могут попытаться материализовать дженерики в Java в будущее. Конечно, это было бы не раньше, чем Java 9, и это было бы огромным изменением, когда было разработано много потенциальных проблем.

0

Проблема может быть частично решена без JVM изменений: В Scala (работаем и на JVM) можно добавить так называемые Manifests которые держат информацию о типе времени выполнения для общих параметров. Я думаю, что это решение может быть адаптировано для Java без особых проблем. Это не идеально, но, вероятно, намного проще реализовать как «реальную вещь».

Смежные вопросы