В чем разница между классом `Class` и классом` Type` в Java? - PullRequest
0 голосов
/ 26 декабря 2018

Я прочитал этот вопрос SO , в котором говорится о разнице между классами и типами в java

Однако речь идет о классах, объявленных с ключевым словом class, а не о фактическомкласс Class в Java.В Java у меня может быть Class<T>, где T - это тип класса / интерфейса / массива (а для примитивов T будет классом с автоматической коробкой, но экземпляр Class<T> будет связан с типом примитива, например,как int.class).Дело в том, что Class используется не только с типами классов.

В чем разница между классом Class и интерфейсом Type? Когда я буду использовать Type в java-программе?

1 Ответ

0 голосов
/ 26 декабря 2018

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.

...