JVMのバックエンドをターゲットに、すべてのKotlinクラスは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
}