以 JVM 后端为目标时,所有 Kotlin 类都编译为 JVM 字节码。java字节码的问题是类型擦除。这意味着所有关于泛型的信息都被删除(这是 Java 的问题,而不是 Kotlin 的问题)。
声明函数类型(transaction: Transaction) -> Unit
等同于使用这种类型:Function1<Transaction, Unit>
. 但是,对于 JVM 字节码,两者Function1<Transaction, Unit>
都是Function1<Transaction, Any>
相同的。
这意味着您的两个构造函数在 JVM 世界中具有相同的签名。
您可以使用“模拟”构造函数companion object
class MyClass {
constructor(db: Database, h: Handler<Transaction>)
companion object {
operator fun invoke(db: Database, handler: (transaction: Transaction) -> Unit) = MyClass(db, Handler<Transaction>({ handler.invoke(it) }))
@JvmName("alternative_constructor")
operator fun invoke(db: Database, handler: (transaction: Transaction) -> Any) = MyClass(db, Handler<Transaction>({ handler.invoke(it) }))
}
}
用法如下所示:
fun main(args: Array<String>) {
val db = Database()
MyClass(db, Handler { }) //real constructor
MyClass(db){ } //version from companion object
}