java - Scala 中 '+' 、 '*' 、 '/' (算术运算符)等基本方法的实现在哪里?

标签 java scala

这可能是最开始的问题,不仅对于 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/

相关文章:

scala - 加特林将数据从 feeder 传递到 exec

scala - 强制 Scala Seq 仅使用单一类型(无 LUB)

java - 使用 CSS3 无法覆盖 JavaFX 8 上 SplitPane 分隔线的颜色和大小

java - JBoss EAP 7.1 部署失败集成器 : Provider not found

java - 启用对象映射器 writeValueAsString 方法以包含空值

java - 作为字节变量/参数的整数文字 : when exactly does the compiler complain?

scala - 为什么spark broadcast在我用extends App的时候效果不好?

java - 在没有其他 Swing 组件的情况下使用 FileSystemView 的 InterruptedException

spring - 如何使用自定义 WebApplicationInitializer 运行测试?

scala - 如何使树映射尾递归?