當目標JVM後臺,所有科特林類被編譯爲JVM字節碼。 java的字節碼的問題是type erasure。這意味着關於泛型的所有信息都被刪除(這是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
}