lambda - 如何在 kotlin 中重载构造函数的 lambda 返回类型不同

标签 lambda kotlin constructor-overloading

我有两个构造函数,它们的不同之处仅在于它们的 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> 的泛型参数),因为在泛型删除后签名会发生冲突。

但是,在您的情况下 UnitAny 的子类型,并且由于 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/

相关文章:

c++ - 从输入容器/迭代器推导 lambda 参数类型

c++ - 是否可以捕获 lambda 类型的异常?

java - 无法更改 Java 文件权限

c++ - 模板类构造函数重载决议

c# - Expression.Lambda 中的 Tailcall 参数

C# - 常量属性是否等同于 lambda 表达式?

android - 读取 .txt 并将信息放入 hashMap

android - 我在 "A build operation failed"以下收到此错误

java - java中的构造函数重载

c++ - 编译时字符串 : constructor overload precedence between `const char *` / `const char[]`