Kotlin 中具有两个类型参数的泛型类

德米特里·索科洛夫
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!

请注意,如果TU不明确,则在尝试调用它们时可能会出现其他错误。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Kotlin抽象类,具有泛型参数和使用类型参数的方法

来自分类Dev

Kotlin中具有不同类型参数数量的两个函数

来自分类Dev

Kotlin中具有不同类型参数数量的两个函数

来自分类Dev

Kotlin 中具有两个不同构造函数的数据类构造函数

来自分类Dev

Kotlin - 具有泛型返回类型的抽象函数

来自分类常见问题

如何检查两个结构在Swift中是否具有相同的泛型参数类型?

来自分类Dev

如何检查两个结构在Swift中是否具有相同的泛型参数类型?

来自分类Dev

在Kotlin中,是否有办法要求泛型类型成为数据类?

来自分类Dev

Kotlin 和 Java 中带有嵌套类的泛型

来自分类Dev

没有重复的Kotlin类泛型

来自分类Dev

具有两个泛型参数的C#中的泛型方法

来自分类Dev

参考 Kotlin 中的泛型类型

来自分类Dev

在 Kotlin 中获取 T 的泛型类型

来自分类Dev

数组作为 Kotlin 中的泛型类型

来自分类Dev

在Kotlin中扩展泛型类

来自分类Dev

Kotlin 中的 Java 泛型:在 Kotlin 中使用 Java 原始类型作为方法参数

来自分类Dev

在Kotlin中覆盖超类的属性时,有没有办法声明更特定的泛型类型?

来自分类Dev

具有两个类型约束和接口实现的泛型类

来自分类Dev

如何在Kotlin中获取经过修饰的泛型参数的实际类型参数?

来自分类Dev

Kotlin-是否可以推断泛型类型参数?

来自分类Dev

Kotlin 在从泛型类生成实例时提供类型

来自分类Dev

KOTLIN:如何为函数中的泛型类型参数分配默认值?

来自分类Dev

在Kotlin中,如何使用本机Java参数实例化泛型类?

来自分类Dev

我可以在kotlin数据类中创建泛型类型吗?

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

Kotlin,具有2个实现和泛型的不可变接口

来自分类Dev

Kotlin:在子类型中覆盖泛型属性

来自分类Dev

在Java中,是否可以使用具有两个类型参数的泛型接口作为每个具有一个固定类型参数的子类型接口的基础?

Related 相关文章

  1. 1

    Kotlin抽象类,具有泛型参数和使用类型参数的方法

  2. 2

    Kotlin中具有不同类型参数数量的两个函数

  3. 3

    Kotlin中具有不同类型参数数量的两个函数

  4. 4

    Kotlin 中具有两个不同构造函数的数据类构造函数

  5. 5

    Kotlin - 具有泛型返回类型的抽象函数

  6. 6

    如何检查两个结构在Swift中是否具有相同的泛型参数类型?

  7. 7

    如何检查两个结构在Swift中是否具有相同的泛型参数类型?

  8. 8

    在Kotlin中,是否有办法要求泛型类型成为数据类?

  9. 9

    Kotlin 和 Java 中带有嵌套类的泛型

  10. 10

    没有重复的Kotlin类泛型

  11. 11

    具有两个泛型参数的C#中的泛型方法

  12. 12

    参考 Kotlin 中的泛型类型

  13. 13

    在 Kotlin 中获取 T 的泛型类型

  14. 14

    数组作为 Kotlin 中的泛型类型

  15. 15

    在Kotlin中扩展泛型类

  16. 16

    Kotlin 中的 Java 泛型:在 Kotlin 中使用 Java 原始类型作为方法参数

  17. 17

    在Kotlin中覆盖超类的属性时,有没有办法声明更特定的泛型类型?

  18. 18

    具有两个类型约束和接口实现的泛型类

  19. 19

    如何在Kotlin中获取经过修饰的泛型参数的实际类型参数?

  20. 20

    Kotlin-是否可以推断泛型类型参数?

  21. 21

    Kotlin 在从泛型类生成实例时提供类型

  22. 22

    KOTLIN:如何为函数中的泛型类型参数分配默认值?

  23. 23

    在Kotlin中,如何使用本机Java参数实例化泛型类?

  24. 24

    我可以在kotlin数据类中创建泛型类型吗?

  25. 25

    类中具有2个泛型类型的方法,其中1个泛型类型

  26. 26

    类中具有2个泛型类型的方法,其中1个泛型类型

  27. 27

    Kotlin,具有2个实现和泛型的不可变接口

  28. 28

    Kotlin:在子类型中覆盖泛型属性

  29. 29

    在Java中,是否可以使用具有两个类型参数的泛型接口作为每个具有一个固定类型参数的子类型接口的基础?

热门标签

归档