Kotlin自定义sealed List实现泛型drop方法时泛型类型不匹配问题
问题原因
这个问题不是Kotlin局部函数不支持复用泛型类型导致的,核心原因是泛型参数重名引发的屏蔽问题:
- 你在
List类头部已经声明了类级别的泛型参数<out A>,类内所有成员默认都可以直接复用这个泛型 - 你在定义
drop方法时额外加了<A>声明,相当于给drop方法单独定义了一个和类泛型重名的新泛型参数,二者是完全独立的两个类型,因此IDE会提示A#1(方法的泛型A)和A#2(类的泛型A)类型不匹配。
解决方法
直接删除drop方法前额外声明的泛型参数<A>即可,方法可以直接复用类层面定义的泛型A,局部函数go也可以直接访问这个泛型,无需额外声明:
sealed class List<out A> { fun drop(n: Int): List<A> { fun go(n: Int, l: List<A>): List<A> = when (n) { 0 -> l else -> go(n - 1, l.tail()) } return go(n, this) } }
内容的提问来源于stack exchange,提问作者jimgug
相关产品推荐
相关产品推荐

