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

Смущенный операторными определениями Int в Scala

В учебнике scala говорится, что операция Int add на самом деле является вызовом метода: 1+1 означает 1.+(1)

Но когда я смотрю в исходный код Int.scala, кажется, что метод просто выведет сообщение об ошибке. Может ли кто-нибудь объяснить мне, как это работает?

 def +(x: Int): Int = sys.error("stub")
4b9b3361

Ответ 1

Int - это класс value, который несколько отличается от других классов. Невозможно выразить примитивное дополнение в scala, не попадая в рекурсивное определение. Например, если определение + было,

def +(x: Int): Int = this + x

Тогда вызов + вызовет +, который будет вызывать +, который...

Scala необходимо скомпилировать методы классов значений в java-байтовые коды для сложения/вычитания/etc.

Компилятор компилирует + в байт-код java для добавления, но авторы библиотеки scala написали Int.scala с методами stub, чтобы сделать его допустимым исходным файлом scala. Эти методы заглушки никогда не вызываются.

Ответ 2

Как говорит реализация, этот метод является заглушкой. По-видимому, его реализация обеспечивается компилятором Scala при компиляции кода, поскольку int + int является примитивной операцией, а язык Scala сам по себе не имеет примитивов - только компилятор знает о примитивах на JVM.

Ответ 3

Важно понимать, что операторы - это методы как вопрос взаимодействия человека с языком. Такие вещи, как + on Int, действуют как любой другой метод в Scala, вместо того, чтобы быть тем, что играет по их собственным правилам.

Однако на уровне реализации они вообще не являются методами: для JVM только классы имеют методы, а подклассы AnyVal не являются классами JVM. Неудивительно, что на уровне реализации они действуют в основном как Java-примитивы.