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, и что такое соответствующий тест?
Ответы
Ответ 1
Вы не можете назначить значение boolean
переменной boolean
, но вы можете конвертировать из boolean
в boolean
с помощью автоматического бокса.
JavaDocs упрощают правила:
Определяет, является ли класс или интерфейс представленный этим объектом класса либо такой же, как или суперкласс или суперинтерфейсом класса или класса интерфейс, представленный указанным Параметр класса. Он возвращает true, если так; иначе он возвращает false. Если этот объект класса представляет собой примитивный тип, этот метод возвращает true, если указанный параметр класса именно этот объект класса; в противном случае он возвращает false.
Ответ 2
javadocs из 1.4 уже указывают, что:
Если этот объект класса представляет примитивный тип, этот метод возвращает true, если указанный параметр класса является именно этим объектом класса; иначе он возвращает false.
Таким образом, поведение этого метода было заблокировано на месте перед введением автоматического бокса и не может быть изменено (новый метод должен быть введен).
Учитывая этот отчет отчет об ошибке, довольно очевидно, что не все случаи краев вокруг объекта класса и то, как автоматический бокс меняет ожидания, были полностью обрабатываются.
Чтобы ответить на вторую часть вашего вопроса, единственный способ проверить этот случай - это последовательность операторов if или какой-либо аналогичный механизм разрешения, который "блокирует" тип примитивного класса.