Как работает guite's TypeLiteral? - PullRequest
27 голосов
/ 30 июля 2010

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

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

Ответы [ 2 ]

29 голосов
/ 30 июля 2010

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

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

8 голосов
/ 30 июля 2010

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

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

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

public abstract class Class1<T>
{
}

public class Class2 extends Class1<Integer>
{
}

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

Проверьте API java.lang.Class для соответствующих методов (у них есть Generic в имени).

...