💬

[Kotlin] Default argments の仕組み

2022/02/27に公開

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