2015-11-05 5 views
21

Iはインターフェースがあります、Java(登録商標)8ではインターフェイスの匿名実装を作成するにはどうすればいいですか?

fun TileSet.union(another: TileSet) : TileSet = 
    // .. 

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

Iタイルのセットの組合を作成できるようにするが(タイルは、xとyの整数座標の対です)

@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を使用した場合の処理​​方法はわかりましたが、タイプに機能シグネチャではなく説明的な名前を付けることをお勧めします。

答えて

34

documentationには匿名クラスの例がありますが、インターフェイスはありません。ドキュメントからの例とは異なり、何の括弧がobject : TileSet後に存在しない、

fun TileSet.union(another: TileSet) : TileSet = 
    object : TileSet { 
     override fun contains(x: Int, y: Int) : Boolean = 
      [email protected](x, y) || another.contains(x, y) 
    } 

お知らせ:

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

+0

私は 'オブジェクトは抽象宣言されなければならないか抽象メンバpublic abstract operator 'を実装する必要があります。なぜですか? – Caipivara

+2

@danielgomezricoこれは、あなたの基本クラス/インタフェース(私の例では 'TileSet')が抽象メソッドを宣言していて、匿名実装でそれを実装する必要があるからです。 – gvlasov

関連する問題