You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:54:28