在Scala中实现基本方法如'+','*','/'(算术运算符)在哪里?

Ryo*_*han 0 java scala

这可能是最初的问题,不仅仅是Scala(我也想知道Java相同),但基本类中基本方法的实现在哪里?例如,乘法运算有一些重载方法,只有关于接口的编写.(https://github.com/scala/scala/blob/2.12.x/​​src/library/scala/Int.scala#L392-L405)

但是,当我环顾四周时,什么都找不到.我怎么知道它们的实现?

Jas*_*r-M 6

这些方法没有实际实施.对于JVM,这些方法甚至不存在.它们由编译器转换为字节码指令.例如,+on 方法Int被转换为iadd字节码指令.

您可以在REPL中看到scalac生成的字节码: iload表示"在堆栈上推送局部变量".iadd从堆栈中弹出两个值,将它们添加为好像它们是整数并将结果推回堆栈.

scala> class Foo { def foo(a: Int, b: Int) = a.+(b) }
defined class Foo

scala> :javap -c -p -filter Foo
Compiled from "<console>"
public class Foo {
  public int foo(int, int);
    Code:
       0: iload_1
       1: iload_2
       2: iadd
       3: ireturn

  public Foo();
    Code:
       0: aload_0
       1: invokespecial #24                 // Method java/lang/Object."<init>":()V
       4: return
}
Run Code Online (Sandbox Code Playgroud)

scala.js的情况下会发生类似的事情,但是生成javascript代码而不是JVM字节码.