Подтвердить что ты не робот

Как работает тип TypeLiteral?

Как Guice TypeLiteral преодолевает процедуру стирания типов ролей Java?

Это творит чудеса, но как это делается?

4b9b3361

Ответ 1

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

Если вы создаете анонимный подкласс new TypeLiteral<List<String>>() {}, он может вызвать getClass().getGenericSuperclass() и получить java.lang.reflect.ParameterizedType, на котором существует метод getActualTypeArguments(), чтобы получить List<String> как экземпляр ParameterizedType.

Ответ 2

Сочетанием анонимных типов, подклассификации и тем фактом, что Java не полностью удаляет ВСЕ общие объявления.

Если вы посмотрите внимательно, TypeLiteral имеет защищенный конструктор, поэтому вы используете дополнительный {} при построении нового, который создает анонимный подкласс TypeLiteral.

В Java общие декларации сохраняются в объявлениях класса и метода, поэтому, если я пишу это.

public abstract class Class1<T>
{
}

public class Class2 extends Class1<Integer>
{
}

Я действительно могу написать код в Class1, который может понять, что его собственный общий тип - Integer, если Class2 был подклассом.

Ознакомьтесь с API java.lang.Class для соответствующих методов (они имеют общее имя).