Как 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 для соответствующих методов (они имеют общее название).