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

如何在Kotlin中将泛型类型标记为非空?

Kotlin泛型强制方法参数非空的实现

需求场景

不管泛型类的类型参数是可空(如String?)还是非空(如String),类中的someMethod方法都只接受非空参数,具体表现要求如下:

val instanceS = MyCoolClass<String?>()
instanceS.someMethod("some not null string") // 编译通过
instanceS.someMethod(null) // 编译失败
val instanceS2 = MyCoolClass<String>()
instanceS2.someMethod("some not null string") // 编译通过
instanceS2.someMethod(null) // 编译失败

问题核心

我们知道可以通过T?将泛型类型标记为可空,但Kotlin中并没有T!这种合法语法来直接将泛型类型强制标记为非空。那该如何实现上述需求?

解决方案:使用交叉类型T & Any

在Kotlin中,可以通过**交叉类型T & Any**实现该效果。Any是非空类型的根类,T & Any表示同时属于T和Any的类型,相当于将T限制为对应的非空版本。

实现代码

class MyCoolClass<T> {
    fun someMethod(value: T & Any) {
        // 这里编写方法逻辑
    }
}

效果验证

  • 当T为String?时,T & Any等价于非空的String,因此someMethod只能接受非空字符串,传入null会触发编译报错;
  • 当T为String时,T & Any仍为String,同样只能接受非空字符串,传入null编译报错。

完全符合需求中的预期表现。

补充说明

交叉类型T & Any是Kotlin 1.6及以上版本支持的语法,它能精准地将泛型类型的可空版本转换为对应的非空版本,从而实现强制参数非空的约束。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:32:06