Kotlin默认构造函数

时间:2018-10-02 03:23:58

标签: kotlin default-constructor

docs说:

  

在JVM上,如果主构造函数的所有参数都具有默认值,则编译器将生成一个附加的无参数构造函数,该构造函数将使用默认值。这样可以更轻松地将Kotlin与通过无参数构造函数创建类实例的Jackson或JPA之类的库一起使用。

但事实并非如此:

Welcome to Kotlin version 1.2.71 (JRE 10.0.2+13-Ubuntu-1ubuntu0.18.04.2)
Type :help for help, :quit for quit
>>> class A(val x: Int = 1, val y: Int = 2)
>>> for (c in A::class.java.constructors) println(c)
public Line_0$A(int,int,int,kotlin.jvm.internal.DefaultConstructorMarker)
public Line_0$A(int,int)
>>> 

我想念什么?

1 个答案:

答案 0 :(得分:3)

我认为REPL将kotlin代码作为脚本运行,无法完全编译。

运行test.kt时:

class A(val x: Int = 1, val y: Int = 2)
fun main(args: Array<String>) {
    for (c in A::class.java.constructors) println(c)
}

kotlinc test.kt -include-runtime -d test.jar
kotlin test.jar

它可以正确打印

public A(int,int,int,kotlin.jvm.internal.DefaultConstructorMarker)
public A()
public A(int,int)

运行test.kts时:

class A(val x: Int = 1, val y: Int = 2)
for (c in A::class.java.constructors) println(c)

使用

kotlinc -script test.kts

它打印

public Test$A(int,int,int,kotlin.jvm.internal.DefaultConstructorMarker)
public Test$A(int,int)

与REPL相同。

因此可以肯定地说,它使用无参数构造函数进行了编译