如何在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
相关产品推荐
相关产品推荐

