递归泛型类AbstractKeyNode赋值this给NT变量时类型不匹配原因
问题解答
一、NT是否属于AbstractKeyNode类型?
是的,NT必然是AbstractKeyNode<K, NT>的子类型。因为泛型约束NT: AbstractKeyNode<K, NT>明确规定:NT必须是继承自AbstractKeyNode的类,且作为泛型参数传递给父类时,要形成自身的类型闭环(即父类的第二个泛型参数就是NT本身)。
二、val node: NT = this类型不匹配的原因
错误核心是父类类型无法直接赋值给子类类型:
- 代码中的
this,其类型是AbstractKeyNode<K, NT>,也就是抽象类本身的类型。 - 而NT是这个抽象类的具体子类(由泛型约束的继承要求决定)。
- Kotlin中,父类实例不能直接赋值给子类类型变量——就像不能把
Animal对象直接赋值给Dog类型变量一样,编译器无法保证当前的this就是NT类型的实例。
举个实际子类的例子就能直观理解:
class ConcreteNode<K: Comparable<K>>(key: K) : AbstractKeyNode<K, ConcreteNode<K>>(key)
当创建ConcreteNode实例时,父类AbstractKeyNode里的this是AbstractKeyNode<K, ConcreteNode<K>>类型,而NT是ConcreteNode<K>,父类类型和子类类型自然不兼容,因此编译器抛出类型不匹配错误。
如果一定要完成这个赋值,可以使用显式类型转换,但这会带来运行时类型转换失败的风险,代码示例:
val node: NT = this as NT
只有当所有继承AbstractKeyNode的子类都严格遵循NT的泛型闭环约束(即子类本身就是父类的第二个泛型参数)时,这个转换才是安全的。
内容的提问来源于stack exchange,提问作者David Blbulyan
相关产品推荐
相关产品推荐

