Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在kotlin中重载构造函数与lambda返回类型不同_Lambda_Kotlin_Constructor Overloading - Fatal编程技术网

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

如何在kotlin中重载构造函数与lambda返回类型不同,lambda,kotlin,constructor-overloading,Lambda,Kotlin,Constructor Overloading,我有两个只在lambda返回类型上不同的构造函数。有没有办法让它们过载?我试图使用JVMLowloads注释,但没有成功 constructor(db : Database, handler: ( transaction: Transaction) -> Unit) : this(db, Handler<Transaction>( {handler.invoke(it)})) @JvmOverloads constructor(db : Database, handler:

我有两个只在lambda返回类型上不同的构造函数。有没有办法让它们过载?我试图使用JVMLowloads注释,但没有成功

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)}))
constructor(db:Database,handler:(transaction:transaction)->Unit):this(db,handler({handler.invoke(it)}))
@JVM重载
构造函数(db:Database,handler:(transaction:transaction)->Any):this(db,handler({handler.invoke(it)}))

您不能定义签名仅在泛型参数上不同的构造函数(在您的情况下,它是
函数1的泛型参数),因为泛型擦除后签名会冲突

但是,在您的情况下,
Unit
Any
的子类型,由于
Function
,您可以将返回
Unit
的函数传递给第二个构造函数,因此只需删除第一个构造函数即可

简化示例:

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

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

当以JVM后端为目标时,所有Kotlin类都被编译为JVM字节码。java字节码的问题是。这意味着所有关于泛型的信息都被删除了(这是Java的问题,不是Kotlin的问题)

声明功能类型<代码>(事务:事务)->Unit
与使用此类型相同:
Function1
。但是,对于JVM字节码,
Function1
Function1
都是相同的

这意味着您的两个构造函数在JVM世界中具有相同的签名

您可以使用
伴生对象

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) }))
    }
}
class-MyClass{
构造函数(db:Database,h:Handler)
伴星{
运算符fun invoke(db:Database,handler:(transaction:transaction)->Unit)=MyClass(db,handler({handler.invoke(it)}))
@JvmName(“替代构造函数”)
运算符fun invoke(db:Database,handler:(transaction:transaction)->Any)=MyClass(db,handler({handler.invoke(it)}))
}
}
用法如下所示:

fun main(args: Array<String>) {
    val db = Database()

    MyClass(db, Handler {  }) //real constructor
    MyClass(db){ } //version from companion object
}
fun main(args:Array){
val db=数据库()
MyClass(db,处理程序{})//实构造函数
MyClass(db){}//来自同伴对象的版本
}
fun main(args: Array<String>) {
    val db = Database()

    MyClass(db, Handler {  }) //real constructor
    MyClass(db){ } //version from companion object
}