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

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

在 java 中我可以做:

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

如何在 Kotlin 做到这一点?

65122 次浏览

来自 Kotlin 的官方语言档案编制:

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

应用到你手头的问题上:

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

正如 Peter Lamberg 指出的——如果匿名类实际上是一个函数接口(也就是说,不是抽象类的)的实现,那么 SAM 转换可以用来进一步简化这个语句:

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

也请注意 这个讨论关于在 Java 和 Kotlin 定义的接口的不同用法。

用爪哇语

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)
}
}

但是因为 比较器功能界面,所以我们可以利用 SAM 转换来写

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

请注意,SAM 特性只适用于 Java 中定义的 Functional接口,如果您需要用单个方法创建 kotlin interfaceobject,那么您将不得不使用 object语法。