Подтвердить что ты не робот

Пытаясь понять "окончательный абстрактный класс Int private расширяет AnyVal в Scala

Начиная с Java Land, я пытался научить себя Scala. Недавно я играл с типом данных Int, и я решил найти API для класса Int здесь.

Что смутило меня, было определение класса для Int, которое abstract final.

Я извиняюсь, если я не прочитал значение abstract и final в Scala, прежде чем задавать этот вопрос, но мне было любопытно, поэтому я сразу же напечатал это сообщение.

Так что я пытаюсь понять: Являются ли семантика для abstract, final и extends разными в Scala? Опять же, насколько я понимаю, в Java нельзя иметь abstract и final одновременно. Итак, как мне интерпретировать final abstract class Int private extends AnyVal?

4b9b3361

Ответ 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: Унифицированные типы