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

时间:2018-03-27 10:23:04

标签: kotlin anonymous-inner-class

我试图将接口的回调实现(在A类中定义)分配给在另一个B类中定义的变量。让我们说A类有接口OnSomethingHappens定义了一个doSomething方法

在B类中我已经定义了我的回调变量:

private lateinit var callback:A.OnSomethingHappens

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

myinstanceA = A(callback)

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

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

但是编译器说"期待成员声明"对于我的回调变量和"名称预期"对象。 我做错了什么?

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

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

为什么呢?哪些是差异和可能的解决方案?

3 个答案:

答案 0 :(得分:1)

从代码片段缩小到如此小的片段并不明显,但你的问题是你在一个类的主体内写下了赋值,但不是在函数内部。

以下是有效声明和立即分配的示例:

class A {
    var x: X? = X()
}

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

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
}

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

class A {
    lateinit var x: X

    fun initializeX() {
        x = X()
    }
}

或在initializer block内(在这种情况下,您甚至不需要lateinit):

class A {
    var x: X

    init {
        x = X()
    }
}

虽然我无法解释如何解决您的确切问题,因为我无法理解哪个类在哪个类中,我希望这些示例和解释有所帮助。

答案 1 :(得分:0)

  

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

这应该有效,但只能在方法中使用:

class B {
    private lateinit var callback:A.OnSomethingHappens

    fun someMethod() {
        callback = object : A.OnSomethingHappens { ... }
    }
    ...
}

鉴于错误消息和private var编译(不在方法中),您试图直接在类的主体中设置它:

class B {
    private lateinit var callback:A.OnSomethingHappens

    callback = object : A.OnSomethingHappens { ... }
    ...
}

这是非法的:您可以在那里编写的唯一代码是成员定义和init块。

另外,如果您可以直接将callback初始化为initlateinit内的/home/user/saltenv,那么首先salt-ssh就没有意义了。

答案 2 :(得分:0)

嗯,让我提出一个变体。这对我来说更简单:

ggplot(df)+
  aes(x=sentiment, y=..density..)+
  geom_histogram(binwidth = 0.01, aes(fill = sentiment < .5)) +
  geom_vline(aes(xintercept=mean(sentiment)),
             color="blue", linetype="dashed", size=0.5)+
  geom_density(alpha=.2,col="#FF6666") +
  scale_fill_manual(values = c("green", "red"))

使用Kotlin lambdas。希望这会对你有所帮助。