isAssignableFrom с ссылочными и примитивными типами


Я хотел бы лучше понять поведение isAssignableFrom в Java между примитивными и ссылочными типами.

Например:

System.out.println(boolean.class.isAssignableFrom(Boolean.class)); // false
System.out.println(Boolean.class.isAssignableFrom(boolean.class)); // false

boolean primitive;
Boolean referenceType = true;
primitive = referenceType;
System.out.println(primitive); // true

Я знаю, что при назначении примитивов ссылка на то, что бокс / распаковка происходит по мере необходимости, но я бы подумал, что поэтому isAssignableFrom вернет true в первых двух примерах выше.

Не мог бы кто-нибудь объяснить, почему он возвращает false, и что такое соответствующий тест здесь?

2   12   2009-10-30 18:45:45

2 ответа:

Вы не можете на самом деле назначить boolean значение переменной Boolean, но вы можете преобразовать из boolean в Boolean с помощью автоматического бокса.

JavaDocs делают правила довольно ясными:

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

В javadocs из 1.4 уже указано, что:

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

Таким образом, поведение этого метода было заблокировано до того, как был введен автоматический бокс, и не может быть изменено (новый метод должен был бы быть введен).

Учитывая этот отчет об ошибке , довольно очевидно, что не все из были полностью обработаны граничные случаи вокруг объекта класса и способы изменения ожиданий автоматической коробкой.

Чтобы ответить на вторую часть вашего вопроса, единственный известный мне способ проверить этот случай-это серия операторов if или какой-то подобный механизм разрешения, который "коробит" тип класса примитива.