Почему это назначение класса номера работает (java)? - PullRequest
1 голос
/ 13 февраля 2020

Я искал дубликат этого, но не вижу реплику, достаточно похожую, чтобы удовлетворить.

Вы не можете создавать экземпляры абстрактных классов в Java, а Number является абстрактным, так почему эта строка compile:

Number num = 3;

Если бы это было целое число num, оно получило бы автоматическую коробку, но работает ли автобокс как-то тоже для Number, даже если оно абстрактное? Или что-то еще происходит?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Integer является подклассом Number, поэтому 3 автоматически загружается из int в Integer, затем Integer сохраняется в переменной Number.

0 голосов
/ 13 февраля 2020

Это не то, что автобокс работает для 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)

...