Это не то, что автобокс работает для Number
. Вы полностью правы, класс Number
является абстрактным и не может быть создан. Также в Java не существует общего механизма для автоматической упаковки простого числа в объект Number
. Это то, что автобокс работает от int
до Integer
. Литерал 3
является int
(без исключения). И Integer
является конкретным подклассом Number
, поэтому поместить ссылку на Integer
в переменную, объявленную как Number
, без проблем.
Может быть немного удивительно, что это работает , Я с тобой согласен. Основное правило автобокса c: вы можете поместить int
там, где ожидается Integer
, double
, где ожидается Double
и так далее. Мы едва ли можем сказать, что Integer
обязательно ожидалось в правой части вашей инициализации. Кажется, они расширили правило, чтобы быть применимыми здесь в любом случае. И это без сомнения где-то в JLS (JLS: Java Спецификация языка).
Просто для проверки мы можем сделать:
Number num = 3;
System.out.println(num.getClass());
Вывод:
class java .lang.Integer
Вы можете продлить правило еще на один шаг:
Object obj = 3;
Это все равно дает Integer
(не просто * 1036) * даже если Object
является конкретным классом).
Ссылка: Аналогичный вопрос: Есть ли Java autobox при назначении типа int для объекта? (вы там же найдете ссылки на JLS)