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
を使用した場合の処理方法はわかりましたが、タイプに機能シグネチャではなく説明的な名前を付けることをお勧めします。
私は 'オブジェクトは抽象宣言されなければならないか抽象メンバpublic abstract operator 'を実装する必要があります。なぜですか? – Caipivara
@danielgomezricoこれは、あなたの基本クラス/インタフェース(私の例では 'TileSet')が抽象メソッドを宣言していて、匿名実装でそれを実装する必要があるからです。 – gvlasov