class MapBuilder<T,U> {
operator fun invoke(arg: T): MapBuilder<T, U> {
return this
}
operator fun invoke(arg: U): MapBuilder<T, U> {
return this
}
}
当然,由于 JVM 的限制,它不起作用。
Platform declaration clash: The following declarations have the same JVM signature (invoke(Ljava/lang/Object;)Lcom/test/tests/MapBuilder;):
operator fun invoke(arg: T): MapBuilder<T, U> defined in com.test.tests.MapBuilder
operator fun invoke(arg: U): MapBuilder<T, U> defined in com.test.tests.MapBuilder
任何想法,我该如何实现?
给定未知的泛型类型,这些方法可以有效地具有相同的签名。因此,所呈现的基本情况对 JVM 来说是模棱两可的。因此,您只需要为它们提供一个可供 JVM(以及 Java 或其他 JVM 语言)查看它们的替代名称。您可以@JvmName
在其中一个或两个上使用注释来为它们提供内部名称。这根本不会影响 Kotlin 和您在 Kotlin 代码中使用的名称,它们会像以前一样看到它们。
class MapBuilder<T,U> {
@JvmName("invokeWithT")
operator fun invoke(arg: T): MapBuilder<T, U> {
return this
}
@JvmName("InvokeWithU") // technically don't need both of these
operator fun invoke(arg: U): MapBuilder<T, U> {
return this
}
}
现在你很好,可以独立使用它们。
val builder = MapBuilder<String, Integer>()
builder("hi") // success!
builder(123) // success!
请注意,如果T
和U
不明确,则在尝试调用它们时可能会出现其他错误。
val builder = MapBuilder<String, String>()
builder("hi") // error!
错误:(y, x) Kotlin:重载解析歧义:
@JvmName public final operator fun invoke(arg: String): MapBuilder 中定义的 MapBuilder
@JvmName public final operator fun invoke(arg: String): MapBuilder 中定义的 MapBuilder
如果您可以以一种可能不会重叠的方式定义您的泛型并且是同一个类,那么您也可以解决这个问题。根据选择的实际泛型参数,您可能会收到错误消息,但至少您的基本声明是允许的。这在Zoe 的回答中有更详细的描述。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句