Как создать анонимный интерфейс интерфейса?
У меня есть интерфейс:
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
, но я хочу, чтобы тип имел описательное имя, а не только подпись функции.
Ответы
Ответ 1
В документации есть примеры анонимных классов, но не для интерфейсов.
Вот как я создал экземпляр интерфейса:
fun TileSet.union(another: TileSet) : TileSet =
object : TileSet {
override fun contains(x: Int, y: Int) : Boolean =
[email protected](x, y) || another.contains(x, y)
}
Обратите внимание, что в отличие от примера из документации нет скобок после object : TileSet
.