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

标签 kotlin generics upperbound

我想知道是否可以创建一个通用类,它接受类型为 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/

    相关文章:

    command-line - 如何通过命令行编译Kotlin以包含Java jar?

    android - DiffUtilCallBack 用于搜索或过滤列表时是否需要使用协程暂停 DiffUtilCallBack?

    快速通用和动态方法调度

    C# 如何在其类型为 List<T> 且我有一个 List<object> 时设置 PropertyInfo 值

    c++ - 如何将 `std::lower_bound` 与 `std::map` 一起使用?

    kotlin - 在 WebClient onErrorResume 中反序列化没有对象映射器的错误响应

    android - RxJava 不在后台线程上运行

    Java:当 B 实现 A 时从 List<B> 转换为 List<A>?

    java:这个 do-while 代码片段的大哦顺序?加上严格的上限