Истинные java-шаблоны (шаблоны) - PullRequest
6 голосов
/ 27 мая 2011

Взглянув на спецификацию Java VM , я заметил, что для создания идентификатора можно использовать гораздо больше, чем просто буквы ASCII.

Во-первых, мне было интересно, есть ли какие-нибудь дополнительные символы (кроме $, которые доступны для идентификаторов)

Как вы думаете, было бы возможно с расширенным набором символов для кодирования дополнительной информации в идентификаторе и пользовательским загрузчиком классов реализовать истинные обобщения Java?

Конечно, вам придется обойти стирание типов, но это может быть возможно с пользовательским парсером?

Таким образом, вы можете хранить общие имена в таком формате: $g$GenericList$_Java_lang_String$

Я использую GenericList здесь, так как я не собираюсь изменять исходную реализацию!

Загрузите их с помощью загрузчика классов, создайте правильную GenericList<String> версию и отправьте ее обратно.

РЕДАКТИРОВАТЬ: Я планирую использовать это для языка, который я строю на JVM. Поскольку он использует $ и _ в качестве специальных символов, такая кодировка может сработать!

РЕДАКТИРОВАТЬ 2: Полагаю, более сложным было бы использование общих методов? У кого-нибудь есть информация о том, как они будут реализованы?

РЕДАКТИРОВАТЬ 3: Поскольку классы могут быть выгружены только после исчезновения загрузчика классов, смогу ли я кэшировать и удалять разрешенные шаблоны, как это работает в .Net, или я делаю это как C ++?

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

JVM допускает любые символы в именах классов / полей / методов, кроме / и ;, которые имеют особое значение.Использование чисел и других символов обычно для обфускаторов, чтобы затруднить декомпиляцию.

Однако вы можете просто использовать $ и _ для сгенерированных классов / полей / методов.

Примечание. Предполагается, что JDK 7 имеет улучшенную общую поддержку с Type скомбинация Class и generics.

EDIT:

Один из способов иметь правильный универсальный тип - всегда использовать

Set<String> set = new LinkedHashSet<String>() { }; 

Использование { } создает анонимногокласс, который имеет родительский тип с универсальным, который вы хотите.Вы можете получить эту информацию с помощью рефлексии.

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

Если у вас есть свои собственные универсальные типы, вы можете просто использовать их в своих методах, как обычные типы.

0 голосов
/ 27 мая 2011

Да, вы можете использовать любой символ Юникода в качестве имени идентификатора в Java.Смотрите здесь для имен идентификаторов, разрешенных в Java.Но, как упоминалось в предыдущем ответе, вы имеете в виду «шаблоны» для «истинных обобщений».

0 голосов
/ 27 мая 2011

Поскольку вы можете использовать Unicode, вы можете использовать практически все, кроме нескольких букв, упомянутых в предыдущем ответе (/ ,;). Между прочим, нет ничего похожего на "настоящие дженерики" ... Я знаю, что вы имеете в виду; D, и это называется "Шаблоны".

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