これらのメソッドの実際の実装はありません。 JVMでは、これらのメソッドは実際には存在しません。それらはコンパイラによってbytecode instructionに翻訳されます。たとえば、Int
のメソッド+
は、バイトコード命令iadd
に変換されます。
スカラックがREPLで生成するバイトコードを確認できます。 iload
は、「スタック上のローカル変数をプッシュする」という意味です。 iadd
は、スタックから2つの値をポップし、整数であるかのように追加し、結果をスタックに戻します。同様の問題が発生したscala.js何かの場合は、代わりにコードが生成されますjavascriptのJVMバイトコードの
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
}
。
私は間違っているかもしれませんが、Javaでは通常のメソッドではなく、特別な演算子( 'instanceof'、' public'、 'synchronized'など)です。 – Gabriel