Подтвердить что ты не робот

Как создать анонимный интерфейс интерфейса?

У меня есть интерфейс:

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, но я хочу, чтобы тип имел описательное имя, а не только подпись функции.

4b9b3361

Ответ 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.