По сути, это потому, что Number
является абстрактным классом - там есть нет конструктора, который соответствует Number(5)
, и даже если бы он существовал, вы не смогли бы создать экземпляр класса напрямую, потому что это аннотация.
Как объясняет Бомбе, во втором случае вы действительно создаете Integer
объект * - который, как подкласс Number
, может быть назначен такой переменной. И поскольку это конкретный класс, вы можете создать его экземпляр.
* Хотя на практике это на самом деле более эквивалентно Integer.valueOf(5)
, который в JRE Sun не будет создавать дополнительный объект Integer, но будет использовать объединенную версию (например, шаблон Flyweight).