2017-12-29 45 views
0

I次のコードを持っている:のJava - 自作インタフェースのためのラムダを使用することはできません - ラムダ変換のターゲット・タイプがインターフェイスである必要があり

public interface Logic 
{ 

    boolean logicAccesscible(); 
} 


public class LocationLogic implements Logic 
{ 
    @Override 
    public boolean logicAccesscible() 
    { 
     return true; 
    } 
} 

をしかし、私はLocationLogicオブジェクトを作成するためにラムダを使用しようとすると、それは単に動作しません。

作品をsnipet
l.setLocationLogic(new LocationLogic() 
    { 
     @Override 
     public boolean logicAccesscible() 
     { 
      return false; 
     } 
    }); 

が、

l.setLocationLogic(() -> 
    { 
     return false; 
    }); 

は私に

「ラムダ変換のターゲット・タイプは、インターフェイスでなければなりません」のエラーを与え、そう、私が使用することを試みた:

l.setLocationLogic((LocationLogic)() -> {return false;}); 
+0

public class LocationLogic implements Logic{ private final boolean accessible; public LocationLogic(boolean accessible){ this.accessible = accessible; } public boolean logicAccessible(){ return accessible; } } 

ようにあなたがそれを使用することができ、そのようにセッター。パブリックvoid setLocationLogic(LocationLogic locationLogic) { this.locationLogic = locationLogic; } – Kishirada

+2

メッセージは明確です。ラムダは機能的なインタフェース**のインスタンスです。 LocationLogicは**クラス**です。あなたのセッターは、LocationLogicではなく、Logicの引数を取るようにしてください。 –

+0

だから私が変えなければならないのは...? – Kishirada

答えて

2

lambdasは、機能インターフェイスからしか作成できないため、このエラーが発生します。wちょうどちょうど一つのabstractメソッドとのインターフェイスを意味します。

あなたのsetLocationLogicLocationLogic(クラス)を想定しており、javaはクラスからのラムダの作成を禁止しています。なぜあなたの最初のスニペットが機能するのですか?

setLocationLogicの署名をsetLocationLogic(Logic logic)に変更してください。

それともあなたが実現される機能で返すブール値を受け入れるLocationLogicでコンストラクタ、作成します。それはちょうど簡単です

l.setLocationLogic(new LocationLogic(false)); 
関連する問題