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