💬
[Kotlin] Default argments の仕組み
Kotlin Default arguments の仕組み
つまり
- overload して初期値設定するメソッドが追加されているのかと思っていたが、違った。
-
add$default
というメソッドが追加されているが、第 3 引数が挙動パラメータになっていて、初期値を利用する引数を指定する。 -
add$default
の第 4 引数については要調査
実験コード
fun add(a :Int = 1, b: Int = 2): Int{
return a + b
}
fun main(){
add()
}
$ kotlinc ./Main.kt -include-runtime -d ./Kotlin.jar; unzip -o Kotlin.jar; javap -p -v -s -constants -c MainKt.class
(省略)
// 第1引数と第2引数の足し算をするメソッドです
public static final int add(int, int);
descriptor: (II)I
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Code:
stack=2, locals=2, args_size=2
0: iload_0
1: iload_1
2: iadd
3: ireturn
LineNumberTable:
line 2: 0
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 a I
0 4 1 b I
//第1引数、第2引数は演算される値
//(第3引数) AND 0x1 の時には、第1引数を初期値1で上書きする
//(第3引数) AND 0x10 の時には、第2引数を初期値2で上書きする
//第4引数は不明
public static int add$default(int, int, int, java.lang.Object);
descriptor: (IIILjava/lang/Object;)I
flags: (0x1009) ACC_PUBLIC, ACC_STATIC, ACC_SYNTHETIC
Code:
stack=2, locals=4, args_size=4
0: iload_2
1: iconst_1
2: iand
3: ifeq 8
6: iconst_1 //第1引数初期値1を設定
7: istore_0
8: iload_2
9: iconst_2
10: iand
11: ifeq 16
14: iconst_2 //第2引数初期値2を設定
15: istore_1
16: iload_0
17: iload_1
18: invokestatic #13 // Method add:(II)I
21: ireturn
StackMapTable: number_of_entries = 2
frame_type = 8 /* same */
frame_type = 7 /* same */
LineNumberTable:
line 1: 0
public static final void main();
descriptor: ()V
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Code:
stack=4, locals=0, args_size=0
0: iconst_0
1: iconst_0
2: iconst_3 //第3引数を0x11にすることで、第1第2引数を両方初期値適用する
3: aconst_null
4: invokestatic #17 // Method add$default:(IIILjava/lang/Object;)I
7: pop
8: return
LineNumberTable:
line 6: 0
line 7: 8
(省略)
Discussion