Как работает тип TypeLiteral?
Как Guice TypeLiteral преодолевает процедуру стирания типов ролей Java?
Это творит чудеса, но как это делается?
Ответы
Ответ 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 для соответствующих методов (они имеют общее имя).