gpt4 book ai didi

Kotlin 泛型多个上限(作为 OR/union 构造)

转载 作者:行者123 更新时间:2023-12-03 17:09:43 27 4
gpt4 key购买 nike

我想知道是否可以创建一个通用类,它接受类型为 T 的实例, 仅限于(例如) String 的实例或 List<String> 的实例.以如下伪代码为例:

data class Wrapper<T : String | List<String>>(val wrapped: T)
这非常类似于 Union构造,它在 Kotlin 中不存在(按设计)。我很好奇这是否可以在编译时检查中实现。
上面提供的伪代码类将用于提供 String 的单个对象实例。 ,如果提供了多个实例,那么它应该是 List<String> .
解决此问题的其他选项包括:
  • 每个“变体”的单独类,即:
    data class Wrapper<T : String>(val wrapped: T)
    data class ListWrapper<T : List<String>>(val wrapped: T)
    这里的缺点显然是它是部分重复的代码。
  • 删除上限,并使用 init块进行实例类型检查。这里的缺点是检查移动到运行时。

  • 编辑:我知道 multiple upper bounds使用 where然而,关键字会导致对符合两个上限的可接受类型的限制(因此,它是一个 AND 构造)

    最佳答案

    虽然您所要求的在 Kotlin 中是不可能的,但可能没有其他选择。
    一种选择是为您的数据类提供两个构造函数。默认构造函数将采用
    元素列表,而次要元素将采用单个/可变元素:

    data class Wrapper<T : String>(val wrapped: List<T>) {
    constructor(vararg wrapped: T) : this(wrapped.toList())
    }
    你的年龄:
    val list = Wrapper(listOf("a", "b", "c"))
    val single = Wrapper("a")
    val multiple = Wrapper("a", "b", "c")
    一个缺点是您的 wrapped属性将始终是一个列表。尽管在某些用例中这可能是一件好事。

    关于Kotlin 泛型多个上限(作为 OR/union 构造),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65881987/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com