interface - 如何创建接口(interface)的匿名实现?

我有一个界面:

interface TileSet {
    fun contains(x: Int, y: Int) : Boolean
}

我希望能够创建图 block 集的并集(图 block 是一对 x 和 y 整数坐标):

fun TileSet.union(another: TileSet) : TileSet = 
   // ..

在 Java 8 中,我可以这样做:

@FunctionalInterface
public interface TileSet {
    boolean contains(int x, int y);

    public default TileSet unite(TileSet another) {
        return (x, y) -> TileSet.this.contains(x, y) && another.contains(x, y);
    }
}

所以接口(interface)是用 TileSet#unite() 中的 lambda 实现的。或者它可以用旧的匿名类方法来实现:

public default TileSet unite(TileSet another) {
    return new TileSet() {
         @Override
         public boolean contains(int x, int y) {
             return TileSet.this.contains(x, y) && another.contains(x, y);
         }
    }
}

如何在 Kotlin 中创建单方法接口(interface)的匿名实现?

如果我使用 (Int, Int) -> Boolean 而不是 TileSet,我知道该怎么做,但我希望类型具有描述性名称而不是只是一个函数签名。

最佳答案

documentation 中有示例用于匿名类,但不适用于接口(interface)。

这就是我创建接口(interface)实例的方式:

fun TileSet.union(another: TileSet) : TileSet =
    object : TileSet {
        override fun contains(x: Int, y: Int) : Boolean =
            this@union.contains(x, y) || another.contains(x, y)
    }

请注意,与文档中的示例不同,object : TileSet 之后没有括号。

https://stackoverflow.com/questions/33552299/

相关文章:

android - IllegalArgumentException : Parameter spe

arrays - Kotlin中数据类的equals方法

kotlin - 实现Java接口(interface)时如何克服 "same JVM signat

gradle - 如何将 Gradle 项目中 Kotlin 的字节码版本设置为 Java 8?

android - Kotlin Coroutines 在 Android 中的正确方式

javascript - Kotlin JavaScript 到 TypeScript 定义文件

kotlin - 意外覆盖 : The following declarations have th

kotlin - Kotlin 中的扩展字段

kotlin - 如何在 Kotlin 中向 Java 类添加静态方法

android - 无法使用 Android Studio 3.0 + DataBinding +