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

Kotlin如何像Java一样继承泛型类时省略类型参数?

在Kotlin中实现类似Java省略泛型参数继承的解决方案

这个问题本质是Kotlin与Java在泛型处理逻辑上的差异:Java允许使用裸类型(即省略泛型参数直接引用泛型类),但Kotlin对泛型的类型安全要求更严格,不支持裸类型。不过我们可以通过星号投影来实现和Java一样的省略效果。

解决方案:使用星号投影替代裸类型

将你的Kotlin代码修改为以下形式即可解决编译报错:

class BaseFragment<V: BaseViewModel<*>>: Fragment() {
    // 这里可以正常编写业务逻辑了
}

为什么这样可行?

BaseViewModel<*>在Kotlin中表示「BaseViewModel的任意泛型实例」,它的作用和Java中直接写BaseViewModel(裸类型)几乎一致:既允许你省略具体的泛型参数N,又符合Kotlin的类型安全规范。

进阶场景:如果需要使用泛型参数N

如果你的BaseFragment需要直接操作N类型的对象(比如定义返回N的方法、接收N类型参数等),可以给BaseFragment也添加对应的泛型参数,形成关联:

class BaseFragment<N, V: BaseViewModel<N>>: Fragment() {
    fun getViewModelData(): N? {
        // 这里可以直接使用N类型
        return (viewModel as? V)?.someNProperty
    }
}

这种方式比星号投影更灵活,能在需要的时候保留类型信息。

内容的提问来源于stack exchange,提问作者Abhishek Tiwari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:37:55