Разница между isSubtype и isAssignable для TypeMirror - PullRequest
3 голосов
/ 13 октября 2011

В документации к интерфейсу утилиты Типы , экземпляр которой должен быть сделан доступным для процессора аннотаций для Java SE 6 или 7 компилятором, есть два метода, которые меня интересуют для кода фрагмент, над которым я работаю. Мне нужно проверить, является ли тип поля типом, который наследуется от определенного абстрактного класса. Два метода, которые кажутся применимыми: isAssignable и isSubtype. Но я не уверен, какой из них использовать.

Я проверил те части спецификации языка Java, на которые есть ссылки в приведенной выше документации. Я понимаю разницу между понятиями подтипов и преобразованием присваивания (по крайней мере, я так думаю). Если я не ошибаюсь, java.lang.Short не будет подтипом примитива long (подтип определяется среди примитивов, но не между классами и примитивами), но его можно назначать так же, как благодаря распаковке и расширению преобразования:

final Short s = 0;
final long l = s;

Тем не менее, я все еще не уверен, какой лучший метод использовать в моем случае. Проверка на подтип кажется более строгой и предпочтительной, чем присваиваемость, но когда дело доходит до классов, создается впечатление, что один автоматически подразумевает другой.

Короткая версия: являются ли isAssignable и isSubtype эквивалентными, когда сравниваемые TypeMirrors оба для классов (не интерфейсов или перечислений)?

1 Ответ

1 голос
/ 13 октября 2011

Если мы берем присвоение ссылок, единственное преобразование, которое применяется в этом случае, - это расширяющееся преобразование ссылок (за исключением преобразования идентичности, конечно). Теперь у нас есть следующие правила для его проведения:

Расширяемое эталонное преобразование существует из любого типа S в любой тип T при условии S является подтипом (§4.10) T.

Это означает, что если вы рассматриваете только классы, не имеет значения, говорите ли вы о подтипах или присваиваемости. Так что да, упомянутые методы в этом случае эквивалентны.

...