我有两个构造函数,它们的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
答案 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
}