Kotlin泛型多重上界(作为或/并集构造)
我想知道是否有可能创建一个泛型类,它接受类型为Kotlin泛型多重上界(作为或/并集构造),kotlin,generics,upperbound,Kotlin,Generics,Upperbound,我想知道是否有可能创建一个泛型类,它接受类型为T的实例,该实例仅限于(例如)字符串的实例或列表的实例。请参见以下伪代码作为示例: data class Wrapper<T : String | List<String>>(val wrapped: T) 这里明显的缺点是它是部分重复的代码 删除上限,并使用init块执行实例类型检查。这里的缺点是检查会移动到运行时 编辑:我知道使用where关键字会对接受的类型造成限制,这些类型同时符合上界(因此,它是和构造)虽然在Kot
T
的实例,该实例仅限于(例如)字符串的实例或列表的实例。请参见以下伪代码作为示例:
data class Wrapper<T : String | List<String>>(val wrapped: T)
这里明显的缺点是它是部分重复的代码
init
块执行实例类型检查。这里的缺点是检查会移动到运行时编辑:我知道使用
where
关键字会对接受的类型造成限制,这些类型同时符合上界(因此,它是和构造)虽然在Kotlin Currenty中您所要求的是不可能的,但可能没有其他选择
一个选项是为数据类提供两个构造函数。默认构造函数将采用
元素列表,而第二个元素将采用单个/可变元素:
数据类包装(val-wrapped:List){
构造函数(vararg wrapped:T):这个(wrapped.toList())
}
语言:
val list=Wrapper(listOf(“a”、“b”、“c”))
val single=包装器(“a”)
val multiple=包装(“a”、“b”、“c”)
一个缺点是wrapped
属性始终是列表。尽管在某些用例中,这可能是一件好事。除非两个类共享一个继承树,否则不可能。注意,这看起来像是一种可能违反单一责任原则的代码气味。不是答案,而是参考:作为一种解决方法,您可以让默认构造函数接受列表,并为单位值提供一个额外的构造函数。第二个构造函数需要将单位值转换为单个元素列表。这并不完全是您所追求的,但取决于您的用例,它可能会起作用<代码>数据类包装器(val wrapped:List){constructor(wrapped:T):this(listOf(wrapped))}
Good one@JakubZalas,但是,我还想提供一个以上的T
实例。如果我对提供T
的单个实例感兴趣,我也可以直接使用T:String
。我已经根据您的使用反馈更新了帖子。谢谢您的回答。缺点在大多数情况下都不是问题,尽管我更喜欢wrapped
属性是T
的实例的解决方案,其中T
可能是一个类或该类的列表。
data class Wrapper<T : String>(val wrapped: T)
data class ListWrapper<T : List<String>>(val wrapped: T)