scala教程说Int
的添加操作实际上是一种方法调用:1+1
表示1.+(1)
但是当我查看Int.scala
的源代码时,似乎该方法只会打印错误消息。谁能向我解释这是如何运作的?
def +(x: Int): Int = sys.error("stub")
答案 0 :(得分:25)
Int是value class,与其他类有些不同。在没有进入递归定义的情况下,无法在scala中表达原始添加。例如,如果+的定义是,
def +(x: Int): Int = this + x
然后调用+将调用+,它将调用+ ...
Scala需要将值类的方法编译为用于加/减/等的java字节代码。
编译器确实将+编译成java字节码以进行添加,但是scala库作者使用存根方法编写了Int.scala,使其成为有效的scala源文件。这些存根方法实际上从未被调用过。
答案 1 :(得分:7)
正如实现所说,该方法是一个存根。显然它的实现是在编译代码时由Scala编译器提供的,因为int + int
是一个原始操作,而Scala语言本身并不具有原语 - 只有编译器知道JVM上的原语。
答案 2 :(得分:7)
重要的是要认识到运算符是一种与语言交互方式的方法。像+
Int
上的内容就像Scala中的任何其他方法一样,而不是按照自己的规则播放的内容。
但是,在实现级别,它们根本不是方法:对于JVM,只有类有方法,而AnyVal
子类不是类,就JVM而言。不出所料,在实现层面,它们的行为大多类似于Java原语。