我有一个界面:
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
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