Если класс Number абстрактный, почему мне разрешено писать Number n = 5? - PullRequest
8 голосов
/ 16 декабря 2009

Number n = new Number(5) недопустимо, но Number n = 5 - нет. Почему?

Ответы [ 4 ]

26 голосов
/ 16 декабря 2009

Из-за автобокса. 5 не является объектом, поэтому он обернут в объект (Integer в данном случае), а Integer является Number.

4 голосов
/ 16 декабря 2009

По сути, это потому, что Number является абстрактным классом - там есть нет конструктора, который соответствует Number(5), и даже если бы он существовал, вы не смогли бы создать экземпляр класса напрямую, потому что это аннотация.

Как объясняет Бомбе, во втором случае вы действительно создаете Integer объект * - который, как подкласс Number, может быть назначен такой переменной. И поскольку это конкретный класс, вы можете создать его экземпляр.

* Хотя на практике это на самом деле более эквивалентно Integer.valueOf(5), который в JRE Sun не будет создавать дополнительный объект Integer, но будет использовать объединенную версию (например, шаблон Flyweight).

3 голосов
/ 17 декабря 2009

Это похоже на то, как будет работать следующее:

List bob = new ArrayList();

Список - это интерфейс, поэтому вы не можете создать его экземпляр напрямую. Однако вы можете объявить переменную типа List и затем назначить ей конкретный объект, который реализует этот интерфейс. В том же ключе вы можете объявить переменную типа Number и затем присвоить ей любой объект-значение, являющийся конкретным экземпляром этого типа. Что вы сделали с функциональным кодом, для всех намерений и целей (из-за автобокса):

Number n = new Integer(5);
0 голосов
/ 16 декабря 2009

Так не должно быть. автобокс - большая ошибка.

...