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