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

时间:2016-09-21 11:35:06

标签: lambda kotlin constructor-overloading

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



Dim Pcodclient As String If Pclient.Value = "CMN" Then Pcodclient.Value = "LSR000" End If If Pclient.Value = "RSS" Then Pcodclient.Value = "LSR000" End If If Pclient.Value = "DEI" Then Pcodclient.Value = "LSR041" End If If Pclient.Value = "CTD" Then Pcodclient.Value = "LSR040" End If

'in randul 1
Cells(ActiveCell.Row, 2).Value = Pclient.Value
Cells(ActiveCell.Row, 3).Value = Pcodclient.Value
Cells(ActiveCell.Row, 4).Value = Pptype.Value

2 个答案:

答案 0 :(得分:5)

您不能定义具有仅在通用参数(在您的情况下,它是private void SomeMethode<T>(List<T> genericList) { } 的通用参数)不同的签名的构造函数,因为签名在泛型擦除后会发生冲突。

但是,在您的情况下,Function1<in P1, out R>是[{1}}的子类型,从Unit is covariant on R开始,您可以将一个返回Any的函数传递给第二个构造函数,所以只需删除第一个。

简化示例:

Function<in P1, out R>

对于更复杂的情况,consider changing to factory functions:与构造函数不同,您可以使用@JvmName对它们进行注释,以避免签名冲突:

Unit

答案 1 :(得分:3)

当定位JVM后端时,所有Kotlin类都被编译为JVM字节码。 java的字节码问题是type erasure。这意味着删除了有关泛型的所有信息(它的Java问题不是Kotlin&#39)。

声明函数类型(transaction: Transaction) -> Unit与使用此类型相同:Function1<Transaction, Unit>。但是,对于JVM字节码,Function1<Transaction, Unit>Function1<Transaction, Any>都是相同的。

这意味着你的构造函数在JVM世界中都有相同的签名。

你可以&#34;模拟&#34;构造函数使用companion object

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) }))
    }
}

用法如下:

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

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