为何声明为String?的变量会被推断为Nothing?类型?
为什么Kotlin中
nullable被推断为Nothing?而非String?? 在以下代码中,nullable被声明为可空String类型,但调用strLength(nullable)时却抛出编译错误,提示推断类型是Nothing?而非预期的String,这是为什么?
fun main() { // nullable 被声明为可空String类型 var nullable: String? // 这行代码是合法的 nullable = null // notNull 参数不接受空值 fun strLength(notNull: String): Int { return notNull.length } println(strLength(nullable)) // 抛出编译错误 }
编译器错误信息:
Type mismatch: inferred type is Nothing? but String was expected
我知道如果在声明时直接赋值null,变量会被推断为Nothing?类型:
val nullable = null // 变量类型为Nothing?
我原以为String?和Nothing?是不兼容的类型,我的理解有误吗?
更新
经过进一步探索,我发现自己对Kotlin类型系统的理解有误:
Nothing?类型的值可以赋值给String?类型的变量:
val nullable: Nothing? = null val maybeString: String? = nullable // 合法
但Int?类型的null不能赋值给String?类型:
val nullable: Int? = null // Type mismatch: inferred type is Int? but String? was expected val maybeString: String? = nullable
因此Nothing?实际上与String?是兼容的。
内容的提问来源于stack exchange,提问作者coinfaces
相关产品推荐
相关产品推荐

