在以下函数中:
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?
。