Kotlin,如何将回调实现分配给变量

use*_*465 5 anonymous-inner-class kotlin

我正在尝试将接口的回调实现(在类 A 中定义)分配给在另一个类 B 中定义的变量。假设类 A 具有接口 OnSomethingHappens,它定义了一个 doSomething 方法。

在 B 类中,我定义了我的回调变量,如下所示:

private lateinit var callback:A.OnSomethingHappens
Run Code Online (Sandbox Code Playgroud)

我需要创建一个类 A 的实例,以这种方式将回调变量传递给构造函数:

myinstanceA = A(callback)
Run Code Online (Sandbox Code Playgroud)

我正在尝试分配一个A.OnSomethingHappens使用以下代码实现的匿名类的实例:

callback = object : A.OnSomethingHappens {
   override fun doSomething(..){
      //here I put the implementation of this method
   }
 }
Run Code Online (Sandbox Code Playgroud)

但是编译器对我的回调变量说“期望成员声明”,对对象说“期望名称”。我做错了什么?

相反,我能够以这种方式定义并同时分配回调变量:

private var callback = object : A.OnSomethingHappens {
      override fun doSomething(..){
        //here I put the implementation of this method
      }
    }
Run Code Online (Sandbox Code Playgroud)

为什么?有哪些区别和可能的解决方案?

zsm*_*b13 1

从代码片段缩减为如此小的片段来看,这一点并不明显,但您的问题是您正在类的主体内写下作业,而不是在函数内写下作业。

以下是有效声明和立即赋值的示例:

class A {
    var x: X? = X()
}
Run Code Online (Sandbox Code Playgroud)

下面是一个无效赋值的示例,它将任意表达式放置在类的主体中:

class A {
    lateinit var x: X

    x = X()        // expression placed inside the class body, invalid syntax
    someFunction() // extra example, calling functions here is invalid in the same way
}
Run Code Online (Sandbox Code Playgroud)

相反,您可以将此初始化放在函数中:

class A {
    lateinit var x: X

    fun initializeX() {
        x = X()
    }
}
Run Code Online (Sandbox Code Playgroud)

或者在初始化块内(在这种情况下,您甚至不需要lateinit):

class A {
    var x: X

    init {
        x = X()
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我无法解释如何解决您的确切问题,因为我不太明白哪个类中的代码,但我希望这些示例和解释有所帮助。