К сожалению (?) Java реализует обобщенные типы, используя Тип Erasure .
Это означает, что нет никакой конструкции для получения универсального типа, и во время выполнения ваш ArrayList фактически хранит только объекты.
Точнее говоря, Generics в Java является конструкцией только во время компиляции.Они гарантируют безопасность типов только во время компиляции.
РЕДАКТИРОВАТЬ: Я только что заметил этот бит кода -
new TypeToken<ArrayList<ServerTask>>() {}.getType()
Это обходной путь для ограничения стирания типа.Информация о типе сохраняется, если вы расширяете универсальный класс определенным типом.Например:
public interface List<T> {
}
public class StringList implements List<String> {
// The bytecode of this class contains type information.
}
В вашем примере вы тривиально расширяете класс TypeToken
, заставляя компилятор генерировать анонимный внутренний класс , который содержит информацию о типе.Реализация TypeToken.getType()
будет использовать отражение, чтобы предоставить вам информацию этого типа.
EDIT2: Для более подробного объяснения взгляните на Reflecting Generics .