Kotlin继承超类时指定泛型边界的正确语法是什么
Kotlin泛型类继承非空参数父类的编译问题解决
错误原因
Kotlin泛型类型参数默认上界为可空类型Any?,若要将泛型约束为非空类型以匹配父类构造的非空Any参数要求,非空上界的声明位置存在语法要求:仅在where子句中声明T : Any不会被编译器在父类构造传参检查阶段识别为有效非空约束,这是编译失败的核心原因。
正确实现
基础非空约束场景
直接在泛型参数声明位置显式指定非空上界T : Any即可通过编译:
open class A( val id: Any ) class B<T : Any>( val clazz: Class<T>, nonnull: T ) : A(nonnull)
多接口约束场景
如果需要同时约束泛型实现多个接口,将非空Any上界保留在泛型声明位,其余接口约束写在where子句中即可:
interface OneInterface interface SecondInterface class B<T : Any>( val clazz: Class<T>, nonnull: T ) : A(nonnull) where T : OneInterface, T : SecondInterface
注意事项
- 父类构造参数的类型检查发生在类声明解析的早期阶段,此时仅识别尖括号内泛型声明处直接标注的上界,后置
where子句的非空约束不会被纳入该阶段的类型校验 - 只要泛型参数在尖括号内声明时未显式标注
: Any,无论后续where子句如何约束,编译器都会判定该泛型可能为可空类型,无法匹配父类要求的非空Any参数
对应编译错误提示如下:
内容的提问来源于stack exchange,提问作者Xobotun
相关产品推荐
相关产品推荐

