如何在Kotlin中创建抽象类的匿名类的实例?


113

假设这KeyAdapter是一个抽象类,具有多个可以重写的方法。

在Java中,我可以执行以下操作:

KeyListener keyListener = new KeyAdapter() {
    @Override public void keyPressed(KeyEvent keyEvent) {
        // ...
    }
};

如何在Kotlin中做同样的事情?


1
我没有投票,但是您的问题表明研究工作很少。一个简单的Google 在kotlin中搜索匿名类的页面就会显示该页面,其中讨论了如何为匿名内部类创建Kotlin类似物。
泰德·霍普

5
我也只是从Kotlin开始。这个问题是一个非常合理的google搜索的第一击。对我来说,最令人困惑的是,该问题中的KeyAdapter很可能是java.awt.event.KeyAdapter,它是一个具有3种方法的抽象类,并且val k: KeyAdapter = KeyAdapter { println("Hello, world!") }无法正常工作。(但是我一直在寻找lambda语法。)我想我会用这个确切的标题来寻找另一个问题,而是一个更好表达的问题,并用注释将其链接到该问题上……
Peter Lamberg

@PeterLamberg不是java.awt,它是Intellij插件API。
Tvaroh

这个问题是在一些Google搜索中首次出现的,相关问题更接近于此,因此我在此处进行链接
Peter Lamberg

12
我不明白为什么将其标记为过于简单。这个问题引起了很多争议,这意味着很多人都面临这个问题。由于语言上的差异,因此解决方案在Google上的成功不是很明显。我浏览了官方文档,但是关于SO的这个问题解决了。
Muz

Answers:


177

Kotlin官方语言文档中

window.addMouseListener(object : MouseAdapter() { 
    override fun mouseClicked(e : MouseEvent) { 
    // ... 
}

适用于您手头的问题:

val keyListener = object : KeyAdapter() { 
    override fun keyPressed(keyEvent : KeyEvent) { 
    // ... 
} 

正如Peter Lamberg指出的那样-如果匿名类实际上是功能接口的实现(即不是抽象类的实现),则可以使用SAM Conversions进一步简化该语句:

val keyListener = KeyAdapter { keyEvent ->
    // ...
}

还请注意有关Java和Kotlin中定义的接口的不同用法的讨论

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.