У меня есть интерфейс:
interface TileSet {
fun contains(x: Int, y: Int) : Boolean
}
Я хочу иметь возможность создавать объединения наборов плиток (tile - пара целочисленных координат 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);
}
}
Таким образом, интерфейс реализован с помощью лямбда в TileSet#unite()
. Или он может быть реализован с использованием старого подхода анонимного класса:
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?
Я знаю, как это сделать, если я использую (Int, Int) -> Boolean
вместо TileSet
, но я хочу, чтобы тип имел описательное имя, а не только подпись функции.