我有两个构造函数,它们的不同之处仅在于它们的 lambda 返回类型。有没有办法让它们重载?我试图使用 Jvm 过载 注释,但它没有工作。
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)}))
最佳答案
您不能定义具有仅在泛型参数上不同的签名的构造函数(在您的情况下,它是 Function1<in P1, out R>
的泛型参数),因为在泛型删除后签名会发生冲突。
但是,在您的情况下 Unit
是 Any
的子类型,并且由于 Function<in P1, out R>
is covariant on R
,您可以传递一个返回 Unit
的函数到第二个构造函数,所以只需删除第一个。
简化示例:
class C(val action: (Int) -> Any)
fun main(args: Array<String>) {
val f: (Int) -> Unit = { println(it) }
C(f)
}
对于更复杂的情况,consider changing to factory functions : 与构造函数不同,你可以用
@JvmName
注释它们为避免签名冲突:@JvmName("createCUnit")
fun createC(f: (Int) -> Unit) = C(f)
fun createC(f: (Int) -> Any) = C(f)
关于lambda - 如何在 kotlin 中重载构造函数的 lambda 返回类型不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615472/