Kotlin泛型子类非可空参数为何能接收null值?
问题解答
你的疑惑核心在于没注意到泛型参数的实际类型推断结果,具体拆解如下:
- 首先看
getResultNullable()的返回类型是Result<String?>,这意味着当你返回Result.Success(null)时,Kotlin会自动将Success的泛型参数T推断为String?,而非你默认以为的非空String。 Success类的构造函数参数是T,此时T的实际类型是String?(可空字符串),所以null完全符合这个参数的类型要求,自然不会报错。- 如果你显式指定
Success的泛型为非空String,比如写Result.Success<String>(null),这时编译器才会报错——因为null无法赋值给非空的String类型。
简单来说:外层Result<String?>的泛型已经把T限定为可空类型,内层Success的T会继承这个可空性,所以构造函数接收null是合法的,不需要把Success的data声明为T?。
内容的提问来源于stack exchange,提问作者K0cur
相关产品推荐
相关产品推荐

