2015-11-05 77 views
21

我有一個接口:如何創建一個接口的匿名實現?

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); 
     } 
    } 
} 

如何創建一個匿名的實施科特林單方法接口:或者,它可能與舊的匿名類的方法來實現?

我知道該怎麼做,如果我使用(Int, Int) -> Boolean而不是TileSet,但我希望該類型具有描述性名稱而不僅僅是一個函數簽名。

回答

34

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後。

+0

我得到'對象必須聲明爲抽象或實現抽象成員public abstract operator.'爲什麼? – Caipivara

+2

@danielgomezrico這必須是因爲你的基類/接口(在我的例子中是'TileSet')聲明瞭一個抽象方法,並且你應該在你的匿名實現中實現它。 – gvlasov