【问题标题】:How to create an instance of anonymous class of abstract class in Kotlin?如何在 Kotlin 中创建抽象类的匿名类的实例?
【发布时间】:2013-07-07 22:14:28
【问题描述】:

假设KeyAdapter 是一个抽象类,其中包含几个可以被覆盖的方法。

在java中我可以做到:

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

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

【问题讨论】:

  • 我没有投反对票,但您的问题表明研究工作很少。对 kotlin 中的匿名类 进行简单的 Google 搜索会出现 this page,其中讨论了 - 在所有事情中 - 如何创建 Kotlin 类比匿名内部类。
  • 我也是刚开始使用 Kotlin。这个问题是一个非常合理的谷歌搜索的第一个命中。令我非常困惑的是,问题中的 KeyAdapter 很可能是 java.awt.event.KeyAdapter,它是一个具有 3 个方法的抽象类,而简单的 val k: KeyAdapter = KeyAdapter { println("Hello, world!") } 将不起作用。 (但是我一直在寻找 lambda 语法。)我想我会寻找具有这个确切标题的另一个问题,但是一个更好的公式化问题并将这个问题与评论链接起来......
  • @PeterLamberg 这不是 java.awt 它是 Intellij 插件 API。
  • 这个问题出现在一些谷歌搜索中,the relevant question is closer to this so I'm linkin it here
  • 我不明白为什么这被标记为太简单了。这个问题得到了很多人的支持,这意味着很多人都面临这个问题。由于语言的差异,谷歌的第一击是否是解决方案并不明显。我浏览了官方文档,但这个关于 SO 的问题清除了它。

标签: java abstract-class kotlin


【解决方案1】:

来自the official Kotlin language documentation

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 ->
    // ...
}

还请注意this discussion 关于 Java 和 Kotlin 中定义的接口的不同用法。

【讨论】:

    【解决方案2】:

    在 Java 中

    private Comparator<Integer> comparator = new Comparator<Integer>(){
        @Override
        public int compare(Integer o1, Integer o2) {
            return o1.compareTo(o2);
        }
    };
    

    在 Kotlin 中

    private val comparator = object: Comparator<Int> {
        override fun compare(o1: Int, o2: Int): Int {
            return o1.compareTo(o2)
        }
    }
    

    但是因为ComparatorFunctionalInterface,我们可以利用SAM conversions 来写

    private val comparator = Comparator<Int> { o1, o2 -> o1.compareTo(o2) }
    

    请注意,SAM 功能仅适用于在 java 中定义的 Functional 接口,如果您需要使用单一方法创建 kotlin interfaceobject,则必须使用 @987654331 @ 语法。

    【讨论】:

    • 我也喜欢这个答案,因为语法更容易“进入”。虽然我渴望使用另一个答案的更简单的语法,但这是我一开始会使用的,并且在 TDD.Academy 直播期间确实使用过,第 36 集,Android:文本框和 TDD #7:youtube.com/watch?v=ikQAmBNdRRo
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多