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()