Type
- это суперинтерфейс Class
.Как правило, вам не нужно использовать его, если вы не выполняете рефлексию с универсальными типами.
Например, мы можем получить тип поля, используя Field.getType()
:
Class<?> c =
String.class.getField("CASE_INSENSITIVE_ORDER")
.getType();
Проблема в том, что String.CASE_INSENSITIVE_ORDER
на самом деле является Comparator<String>
, и приведенный выше код получит только Comparator.class
.Это не работает для нас, если нам нужно было узнать, что это за аргумент типа.
Type
и его использование были добавлены в Java 1.5 (вместе с обобщениями) для этого типаситуация.Вместо этого мы могли бы использовать метод Field.getGenericType()
:
Type t =
String.class.getField("CASE_INSENSITIVE_ORDER")
.getGenericType();
В этом случае он вернул бы экземпляр ParameterizedType
, с Comparator.class
в качествеего необработанный тип и String.class
в его аргументах типа:
ParameterizedType pt = (ParameterizedType) t;
pt.getRawType(); // interface java.util.Comparator
pt.getActualTypeArguments(); // [class java.lang.String]
Эта часть API не очень хорошо разработана, но есть некоторые более лучшие, построенные на ее основе, такие как Guava TypeToken
.