Это возможно для компилятора, чтобы выполнить операцию бокса
затем следует операция расширения для сопоставления вызова с методом.
Давайте возьмем пример
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
Позвольте мне показать, как это работает за кулисами. Когда JVM,
попал в строку, которая вызывает метод go ():
- Байт b был помещен в байт.
- Ссылка на байт была расширена на объект (поскольку байт расширяет объект).
- Метод go () получил ссылку на объект, которая фактически ссылается на байт
объект.
- Метод go () возвращает ссылку на объект обратно в ссылку на байт.
член, в этом сценарии никогда не было объекта типа Object, только
объект типа Byte!).
- Метод go () печатает значение байта.
Но в вашем случае. Почему компилятор не пытался использовать логику box-then-widen, когда он пытался работать с классом WidenAndBox?
если бы он попытался сначала боксировать, байт был бы преобразован в байт. Теперь мы снова пытаемся расширить байт до длинного, и, конечно, тест IS-A не проходит.