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)
>>>
我想念什么?
答案 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相同。
因此可以肯定地说,它使用无参数构造函数进行了编译。