Как TypeLiteral работы guice это?
Как Guice TypeLiteral преодолевает процедуру стирания общих типов Java?
Он творит чудеса, но как это достигается?
2 ответов
трюк, который используется здесь, заключается в том, что подписи общих супер типов хранятся в подклассах и, следовательно,выжить стирание.
если вы создаете анонимный подкласс new TypeLiteral<List<String>>() {}
Guice может вызвать getClass().getGenericSuperclass()
его java.lang.reflect.ParameterizedType
на котором существует метод getActualTypeArguments()
и List<String>
в качестве примера ParameterizedType
.
комбинацией анонимных типов, подклассов и тем, что Java не полностью стирает все общие объявления.
Если вы внимательно посмотрите, TypeLiteral имеет защищенный конструктор, поэтому вы используете дополнительный {} при построении нового, который создает анонимный подкласс TypeLiteral.
в Java общие объявления сохраняются в объявлениях класса и метода, поэтому, если я напишу это.
public abstract class Class1<T>
{
}
public class Class2 extends Class1<Integer>
{
}
Я могу написать код в Class1, который может выяснить, что его собственный универсальный тип является целым, если Class2 был подклассом.
Проверьте java.ленг.Класс API для соответствующих методов (они имеют общее название).