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)
您不能使用仅在通用参数上有所不同的签名来定义构造函数(在您的情况下,它是的通用参数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)
| 归档时间: |
|
| 查看次数: |
766 次 |
| 最近记录: |