我正在使用Kotlin学习android开发。作为主要的Web开发人员,我对这两种技术都是陌生的。
在寻找API-29连接解决方案(NetworkInfo和getActiveNetworkInfo中已弃用API-29)时,我遍历了该表达式以进行变量声明。
protected var callbackFunction: ((Boolean) -> Unit) = {}
abstract fun startListening(callback: (Boolean) -> Unit)
Run Code Online (Sandbox Code Playgroud)
我将如何解释?我说的是,变量callbackFunction是Boolean类型还是Unit类型。或者是其他东西。在该抽象函数中,回调类型是Boolean还是Unit或其他?
我也对花括号有点困惑。这是否意味着变量是由空的匿名函数(类似于JavaScript)初始化的,还是完全不同的概念?
Kotlin支持函数式编程,这意味着在Kotlin中将函数视为一等公民。就像任何其他变量一样,它们可以传递或从函数中返回。
所以,
protected var callbackFunction: ((Boolean) -> Unit) = {}
Run Code Online (Sandbox Code Playgroud)
callbackFunction是实现Function的变量interface。您可以有效地说这是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
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们看一下字节码,我们可以看到它在做什么:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
检查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
}
Run Code Online (Sandbox Code Playgroud)
您可以将callbackFunction变量传递给startListening()抽象方法,因为该方法接受将布尔作为参数并返回Unit的lambda。因此,callbackFunction匹配abstract方法的参数,我们现在可以传递它。
我将如何解释?
在该抽象函数中,回调类型是Boolean还是Unit或其他?
关于花括号。这是否意味着变量由空的匿名函数初始化?
abstract声明中使用花括号以使其具体实现一样,我们可以在此处执行相同的操作。| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |