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)