我正在使用Kotlin学习android开发。作为主要的Web开发人员,我对这两种技术都是陌生的。
在寻找API-29连接解决方案(NetworkInfo
中已弃用getActiveNetworkInfo
和API-29
)时,我遇到了该表达式以进行变量声明。
protected var callbackFunction: ((Boolean) -> Unit) = {}
abstract fun startListening(callback: (Boolean) -> Unit)
我将如何解释?我是说变量callbackFunction是布尔类型还是单元类型。或者是其他东西。在该抽象函数中,回调类型是Boolean还是Unit或其他?
关于花括号,我也有些困惑。这是否意味着变量是由空的匿名函数(类似于JavaScript)初始化的,还是完全不同的概念?
答案 0 :(得分:5)
Kotlin支持函数编程,这意味着在Kotlin中将函数视为一等公民。就像其他变量一样,它们可以传递或从函数中返回。
所以
protected var callbackFunction: ((Boolean) -> Unit) = {}
callbackFunction
是实现功能interface
的变量。您可以有效地说这是lambda。要定义lambda 类型,请在:
之后使用Boolean
作为参数,并在箭头->
之后表示它返回Unit
void
就Java而言。在=
之后,我们给它加上花括号。
这是调用时的样子:
class Test {
var callbackFunction: ((Boolean) -> Unit) = {}
fun higherOrderFunction(block: (Boolean) -> Unit) {
block(true)
}
}
fun main() {
Test().higherOrderFunction { it ->
println(it) //print true
}
}
如果我们看一下字节码,就可以看到它在做什么:
public final class Test {
@NotNull
private Function1 callbackFunction;
@NotNull
public final Function1 getCallbackFunction() {
return this.callbackFunction;
}
public final void setCallbackFunction(@NotNull Function1 var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.callbackFunction = var1;
}
public Test() {
this.callbackFunction = (Function1)null.INSTANCE;
}
}
检查callbackFunction
是Function1
类型的。现在,让我们看一下Function1
的声明。
/** A function that takes 1 argument. */
public interface Function1<in P1, out R> : Function<R> {
/** Invokes the function with the specified argument. */
public operator fun invoke(p1: P1): R
}
您可以将callbackFunction
变量传递给startListening()
抽象方法,因为此方法接受一个以布尔作为参数并返回Unit的lambda。因此,callbackFunction
与abstract方法的参数匹配,我们现在可以传递它。
我将如何解释?
在该抽象函数中,回调类型是Boolean还是Unit或其他?
关于花括号。这是否意味着变量是由一个空的匿名函数初始化的?
abstract
声明中使用花括号以使其具体实现一样,我们可以在此处执行相同的操作。