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

为何声明为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:45:56