Подтвердить что ты не робот

IsAssignable От ссылочных и примитивных типов

Я хотел бы лучше понять поведение 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, и что такое соответствующий тест?

4b9b3361

Ответ 1

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

JavaDocs упрощают правила:

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

Ответ 2

javadocs из 1.4 уже указывают, что:

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

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

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

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