web-dev-qa-db-ja.com

インターフェイスの匿名実装を作成する方法は?

私はインターフェイスを持っています:

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

タイルのセットの和集合を作成できるようにしたい(タイルは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で単一メソッドインターフェイスの匿名実装を作成するにはどうすればよいですか?

TileSetの代わりに_(Int, Int) -> Boolean_を使用する場合の方法は知っていますが、型には関数のシグネチャではなく、わかりやすい名前が必要です。

41
gvlasov

documentation には、匿名クラスの例がありますが、インターフェイスの例はありません。

これは、インターフェイスのインスタンスを作成する方法です。

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の後に括弧はありません。

64
gvlasov