scala教程说,Int添加操作实际上是一种方法调用:1+1意思是1.+(1)
但是当我查看源代码时Int.scala,看起来该方法只会打印一条错误消息.任何人都可以向我解释这是如何工作的?
def +(x: Int): Int = sys.error("stub")
Run Code Online (Sandbox Code Playgroud)
sbr*_*ges 25
Int是一个值类,与其他类有些不同.在没有进入递归定义的情况下,无法在scala中表达原始添加.例如,如果+的定义是,
def +(x: Int): Int = this + x
Run Code Online (Sandbox Code Playgroud)
然后调用+将调用+,它会调用+ ...
Scala需要将值类的方法编译为用于加/减/等的java字节代码.
编译器确实将+编译成java字节码以进行添加,但是scala库作者使用存根方法编写了Int.scala,使其成为有效的scala源文件.这些存根方法实际上从未被调用过.
正如实现所说,该方法是一个存根.显然,它的实现是在编译代码时由Scala编译器提供的,因为它int + int是一个原始操作,而Scala语言本身并不具有原语 - 只有编译器知道JVM上的原语.
重要的是要认识到操作符是一种与语言交互方式的方法.比如像+上Int像斯卡拉任何其他方法的行为,而不是被一些由他们自己的规则玩.
但是,在实现级别,它们根本不是方法:对于JVM,只有类具有方法,并且AnyVal就JVM而言,子类不是类.不出所料,在实现层面,它们的行为大多类似于Java原语.
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |