Возможно, что компилятор выполнил операцию бокса , за которой следует операция расширения, чтобы соответствовать вызову методу. Давайте рассмотрим пример
class BoxAndWiden {
static void go(Object o) {
Byte b2 = (Byte) o; // ok - it's a Byte object
System.out.println(b2);
}
public static void main(String [] args) {
byte b = 5;
go(b); // can this byte turn into an Object ?
}
}
компилируется и производит вывод (!): 5 Позвольте мне показать, как она работает за scene.when виртуальная машина, попал в линию, которая вызывает идти() метод:
- Байт b помещен в байт.
- Ссылка на байты была расширена до объекта (поскольку Byte расширяет объект).
- Метод go() получил ссылку на объект, которая фактически относится к объекту Byte .
- Метод go() возвращает ссылку на объект обратно на ссылку байта (член , в этом сценарии никогда не было объекта типа Object, только объект типа типа Byte!).
- Метод go() напечатал значение байта.
Но в вашем случае. Почему компилятор не попытался использовать логику box-then-expand, когда он пытался справиться с классом WidenAndBox?
Если он попытался вставить сначала, байт был бы преобразован в байт. Теперь мы снова пытаемся расширить байт до длинного, и, конечно, тест IS-A терпит неудачу.
Я знаю, что это, вероятно, теоретическое, но почему бы не заставить функцию взять «номер x»? – Powerlord
Ошибка IS-A здесь.байтовый примитивный класс-оболочка - это Byte, но в качестве правила Java вы не можете применять расширение для объектов-оболочек, я имею в виду, что Byte не может расширяться до Long. (хорошо я знаю довольно поздно, но уверен, что люди проведут этот ответ :)) – HRgiger
Что делать, если переменная b была int? – Ascendant