Kotlin泛型与sealed interface结合使用出现编译错误问题求助
问题原因
1. 类型不匹配报错原因
泛型参数P的上界是Params,但Kotlin编译器无法将类型判断得到的DefaultParams/ExtendedParams具体类型,和P的实际类型做逻辑绑定。即使你已经通过is判断确认了form.params的具体类型,编译器也不会默认该具体类型就和当前的P类型完全一致,因此会判定你将具体子类型赋值给泛型参数P的操作类型不匹配。
2. 密封接口仍需else分支的原因
你when语句的判断对象是form.params,它的类型是泛型P而非直接是Params。Kotlin编译器目前不会基于「泛型上界是密封类/接口」就自动枚举所有子类型做穷尽检查,因此会认为你没有覆盖所有可能的分支,要求必须补充else分支。
解决方案
改动最小的方案是在每个分支做安全强转,因为你已经通过类型判断保证了当前params的类型和P的实际类型一致,强转不会产生运行时异常。修改后的Mutator代码如下:
class Mutator<out P : Params>(val form: Form<P>) { fun modifyName(name: String): Form<P> = when (form.params) { is DefaultParams -> form.copy(params = form.params.copy(name = name) as P) is ExtendedParams -> form.copy(params = form.params.copy(name = name) as P) else -> form } }
修改后代码即可正常编译运行,符合预期的使用逻辑。
内容的提问来源于stack exchange,提问作者lrxw
相关产品推荐
相关产品推荐

