Ответ 1
Как отмечалось в комментарии om-nom-nom, abstract
запрещает создание экземпляра (new Int
), тогда как final
запрещает подклассу (new Int { ... }
).
Причиной этого является то, что scala.Int
непосредственно представлен примитивным целым типом виртуальной машины Java; другие аналогичные типы Byte
, Short
, Char
, Long
, Float
, Double
, Boolean
. Поскольку они являются примитивными типами во время выполнения (демонстрируют лучшую производительность, чем так называемые типы в штучной упаковке), и JVM не позволяет добавлять новые примитивы, не было бы законного способа расширения этих типов. Также не существует способа их создания, кроме как путем предоставления литерала (val i: Int = 33
).
Scala имеет эти типы для создания единой системы объектов, где нет логической разницы между примитивными типами и "объектами". Однако существует иерархическое различие наверху, которое AnyRef
(соответствующее java.lang.Object
) и AnyVal
(соответствующее этим примитивным типам, и добавление Scala нового типа Unit
).
Подробнее о системе унифицированного типа дается Tour Scala: Унифицированные типы