Kotlin中如何为List设置泛型约束,限定元素同时继承Super类并实现Conditional接口
你写的List<Super : Conditional>是泛型约束的语法,不能直接用在变量的类型声明位置,Kotlin提供了三种成熟的方案实现你的需求,都能做到编译期静态检查,不需要强转:
方案1:泛型约束辅助函数(全版本兼容)
这是兼容性最好的写法,所有Kotlin版本都支持,不需要显式声明变量类型,编译器自动完成检查:
先定义带多约束的工具函数:
fun <T> conditionalListOf(vararg elements: T): List<T> where T : Super, T : Conditional = elements.toList()
使用示例:
// 编译正常 val conditionals = conditionalListOf(A()) // 编译直接报错,B不满足Conditional接口约束 val invalidList = conditionalListOf(A(), B())
方案2:交集类型声明(Kotlin 1.6+支持)
如果你需要显式声明变量的类型,可以用Kotlin 1.6引入的交集类型语法,用&连接多个约束类型:
// 声明List的元素必须同时满足是Super子类、实现Conditional接口 val conditionals: List<Super & Conditional> = listOf(A()) // 编译报错,B不符合类型要求 val invalidList: List<Super & Conditional> = listOf(A(), B())
方案3:约束类型别名复用(Kotlin 1.7+支持)
如果这个类型需要在多处使用,可以定义带约束的类型别名简化代码:
typealias SuperConditional = T where T : Super, T : Conditional // 直接使用别名声明 val conditionals: List<SuperConditional> = listOf(A())
补充说明
你之前遇到类型推断不准的问题,是因为直接用原生listOf时,编译器会默认推导元素的最近公共父类为Super,不会自动叠加Conditional接口的约束,只要用上面三种方案显式加约束,就不需要手动强转,完全由编译器做静态校验。
内容的提问来源于stack exchange,提问作者Arturs Vancans
相关产品推荐
相关产品推荐

