9

私はこれに沿ったものに見えるインターフェースを使用しています:

public interface ObjectListener {
    public void objectAdded(Object o);
    public void objectRemoved(Object o);
}

また、現在、匿名クラスを使用してインターフェイスを実装していますが、2 つのメソッドのいずれかは気にしません。これに沿った何か:

someObject.addListener(new ObjectListener() {

    @Override
    public void objectAdded(Object o) {
        doSomething(o);
    }

    @Override
    public void objectRemoved(Object o) {}
});

今、私は Java 8 で可能な限り新しいラムダ式を使用してきましたが、このような状況では追加された単純さを使用したいと考えています。結局のところ、メソッドの 1 つしか実装していませんが、インターフェイスにメソッドが 2 つあるため、ラムダ式で使用することはできません。

この制限を回避する方法はありますか?

4

2 に答える 2

9

ラムダ式で関数型インターフェースではない既存のインターフェースを再利用するには、Java8 の新しい機能であるデフォルト メソッドも使用する必要があります。

この場合、匿名クラスの代わりにラムダ式を使用する場合は、次の操作を行う必要があります。

まず、ObjectListener を新しいインターフェースとして再定義する必要があります。

public interface ObjectAddedListener extends ObjectListener {
    @Override
    default public void objectRemoved(Object o) {}
}

気にしないメソッドに空のデフォルト実装を追加するだけです。これにより、objectAdded()メソッドはインターフェース内の唯一の抽象メソッドとして残ります。

次に、任意の ObjectListener の代わりに新しい型を使用できます。新しいインターフェイスには実装のないメソッドが 1 つしかないため、次のようにラムダ式で使用できます。

ObjectAddedListener listener = o -> doSomething(o);
someObject.addListener(listener);

この新しい型をaddListener()メソッドで直接使用したい場合は、最初に次のように新しく定義された型としてラムダ式をキャストする必要があることに注意してください。

someObject.addListener((ObjectAddedListener) o -> doSomething(o));
于 2014-04-25T04:51:22.750 に答える