Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lambda 为什么此不可为空的val变为“val”;“可为空”吗;?_Lambda_Kotlin_Callback_Type Inference_Kotlin Null Safety - Fatal编程技术网

Lambda 为什么此不可为空的val变为“val”;“可为空”吗;?

Lambda 为什么此不可为空的val变为“val”;“可为空”吗;?,lambda,kotlin,callback,type-inference,kotlin-null-safety,Lambda,Kotlin,Callback,Type Inference,Kotlin Null Safety,所以我有一个简单的回调类: class Callback<T>( val onResponse: (T) -> Unit, val onError:(Throwable)->Unit ) 这给我带来了一个错误: 引用有一个可空类型((Throwable)->Unit)使用显式?.invoke()来进行类似于调用的函数 它似乎期望的是 else -> callback?.onError?.invoke(reason) 我不太明白为什么。callba

所以我有一个简单的回调类:

class Callback<T>(
    val onResponse: (T) -> Unit,
    val onError:(Throwable)->Unit
)
这给我带来了一个错误:

引用有一个可空类型
((Throwable)->Unit)
使用显式
?.invoke()
来进行类似于调用的函数

它似乎期望的是

else -> callback?.onError?.invoke(reason)
我不太明白为什么。
callback
不为null这一事实不足以证明必须存在一个非null的
onError
函数吗

雪上加霜,如果我写信

else -> callback?.let{it.onError(reason)}
然后它接受了这一点,但不是在警告我应该这样做之前

删除多余的
。让
调用


如果使用safe call运算符在
callback
对象上调用名为
onError
的函数,则
callback?.onError()
语法是正确的。但是,在本例中,您首先读取
回调
的属性,然后对该属性返回的内容调用另一个函数

因此,与只包含一个步骤和两个部分的表达式不同:

callback   ?.onError()
实际上有一个由三部分组成的表达式,一行有两个运算符:

callback   ?.onError   ()
这里的最后一步,
()
,是调用对象的
invoke
操作符,该对象返回
onError

callback   ?.onError   .invoke()
但是,由于使用安全调用运算符读取
onError
属性,因此此对象可能为
null
。在这种情况下,您不能在其运算符形式中使用
invoke
(顺便说一句,任何其他运算符也是如此),因此您必须显式地将其写出,并添加另一个安全调用:

callback   ?.onError   ?.invoke()


至于意图操作告诉您可以删除冗余的
let
:这是一个bug,应该报告。

回调不为null的事实不足以推导出必须存在非null的onError函数吗?
在您的例子中,您将
回调
标记为null,所以有可能是空的,嗯,实际上这很有道理。非常感谢。你是否已经在追踪器中提到了这一点,或者我应该继续添加它?我还没有为它创建问题,所以请继续!也可以把它链接到这里。
callback   ?.onError   ?.invoke()