为什么withContext返回一个可以为null的对象



在以下函数中:

suspend fun loadData(filename: String): MyData {
return withContext(Dispatchers.IO) {
loader.loadJsonFromFile(filename)?.let { json ->
Gson().fromJson<MyData>(
jsonStr,
object : TypeToken<MyData>() {}.type
)
}
}
}

编译器抱怨withContext返回了一个可为null的类型MyData?,但是withContext的签名看起来像

public suspend fun <T> withContext(
context: CoroutineContext,
block: suspend CoroutineScope.() -> T
): T

我已经将T定义为MyData(不可为null(。为什么编译器会给我一个错误,我可以在不使用var的情况下编写这个函数吗?

您还没有定义T,编译器为您推断了它(我指的是withContext中的T(。如果loadJsonFromFile返回null,则传递给withContext的lambda可能返回null,因此withContext也可以返回null,并且编译器非常正确地将T推断为MyData?

最新更新