这可能是最开始的问题,不仅对于 Scala(我也想知道 Java 也是如此),而且基本类中基本方法的实现在哪里?例如,乘法运算有一些重载方法,并且只写了接口(interface)。 (https://github.com/scala/scala/blob/2.12.x/src/library/scala/Int.scala#L392-L405)
但是,当我环顾四周时,却什么也没发现。我怎样才能知道他们的实现情况?
最佳答案
这些方法没有实际实现。对于 JVM 来说,这些方法根本不存在。它们被编译器翻译为 bytecode instruction 。例如,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
}
如果是 scala.js类似的事情也会发生,但生成的不是 JVM 字节码,而是 javascript 代码。
关于java - Scala 中 '+' 、 '*' 、 '/' (算术运算符)等基本方法的实现在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41104379/