Есть ли альтернатива Class.isAssignableFrom, которая работает с объектами Type? - PullRequest
7 голосов
/ 27 октября 2011

В Java Class имеет метод isAssignableFrom , определяемый следующим образом:

public boolean isAssignableFrom(Class<?> cls)

Определяет, представлен ли класс или интерфейсэтим Class объект является тем же или является суперклассом или суперинтерфейсом класса или интерфейса, представленного указанным параметром Class.Возвращает true, если так;в противном случае возвращается false.Если этот Class объект представляет примитивный тип, этот метод возвращает true, если указанный параметр Class является именно этим Class объектом;в противном случае возвращается false.

В частности, этот метод проверяет, может ли тип, представленный указанным параметром Class, быть преобразован в тип, представленный этим объектом Class, посредством преобразования идентификаторов или расширенияконверсия ссылок.Подробности см. В Спецификации языка Java, разделы 5.1.1 и 5.1.4.

Параметры:

cls - проверяемый объект Class

Возвращает:

значение boolean, указывающее, можно ли назначать объекты типа cls объектам этого класса

Class реализует интерфейс Type.Есть ли эквивалентный isAssignableFrom метод, который работает на Type s вместо Class es?Например, существует ли метод, который определяет, может ли переменная типа List<String> (которая будет представлена ​​через экземпляр ParameterizedType) быть присвоена переменной типа List<? extends Object>?

Ответы [ 3 ]

2 голосов
/ 27 октября 2011

Посмотрите на javaRuntype - я нашел это полезным. Он может создавать представления типов из экземпляров java.lang.reflect.Type и проверять присвоение между ними.

1 голос
/ 02 февраля 2016

Guava's TypeToken предоставляет эту функциональность. На ваш запрос можно ответить так:

// represents List<String>
ParameterizedType stringList = ...; 

// represents List<? extends Object>
TypeToken objectList = new TypeToken<List<? extends Object>>(){};

boolean isAssignable = objectList.isAssignableFrom( stringList );
0 голосов
/ 27 октября 2011

Вы можете использовать любой Список <...> - s, защита слабее, чем обычно.

Попробуйте это

    List<String> a = new Vector<String>();
    List<Integer> b = new Vector<Integer>();
    Integer i = new Integer(0);

    b.add(2);

    a = (List<String>) (Object) b;

    System.out.println((Object)a.get(0));

исключений не будет.

Это потому, что обобщения являются только понятием времени компиляции.

Если вы напишите

           System.out.println(a.get(0));

, вы получите ClassCastException, поскольку версия функции println, определенная во время компиляции, будет println (String arg).

Ах, поэтому ответ на вопрос: не должно быть такой альтернативы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...