如何在Kotlin中重载构造函数的不同之处在于Lambda返回类型

rus*_*sna 3 lambda constructor-overloading kotlin

我有两个构造函数,它们的lambda返回类型不同。有什么选择可以使它们超载吗?我试图使用JvmOverloads注释,但是没有用。

constructor(db : Database, handler: ( transaction: Transaction) -> Unit) : this(db, Handler<Transaction>( {handler.invoke(it)}))

@JvmOverloads
constructor(db : Database, handler: ( transaction: Transaction) -> Any) : this(db, Handler<Transaction>( {handler.invoke(it)}))
Run Code Online (Sandbox Code Playgroud)

hot*_*key 5

您不能使用仅在通用参数上有所不同的签名来定义构造函数(在您的情况下,它是的通用参数Function1<in P1, out R>),因为签名在通用擦除后会发生冲突。

但是,在您的情况下Unit是的子类型Any,并且由于Function<in P1, out R> 是的协变量R,您可以传递一个返回Unit第二个构造函数的函数,因此只需删除第一个构造函数即可。

简化示例:

class C(val action: (Int) -> Any)

fun main(args: Array<String>) {
    val f: (Int) -> Unit = { println(it) }
    C(f)
}
Run Code Online (Sandbox Code Playgroud)

对于更复杂的情况,请考虑更改为工厂函数:与构造函数不同,可以使用注释它们@JvmName以避免签名冲突:

@JvmName("createCUnit")
fun createC(f: (Int) -> Unit) = C(f)

fun createC(f: (Int) -> Any) = C(f)
Run Code Online (Sandbox Code Playgroud)