2017-12-29 22 views
0

Ich habe den folgenden Code:Java - Lambda kann nicht für Eigenbau-Schnittstelle verwenden - Zieltyp Lambda-Umwandlung muss eine Schnittstelle seine

public interface Logic 
{ 

    boolean logicAccesscible(); 
} 


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

Aber wenn ich versuche, ein Lambda zu verwenden, um ein Objekt zu erstellen LocationLogic Es wird einfach nicht funktionieren.

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

, die Werke snipet, aber

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

gibt mir den Fehler "Zieltyp Lambda-Umwandlung muss eine Schnittstelle sein"

Und ja, ich habe zu verwenden versucht:

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

Es ist nur ein einfaches:

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

diese Weise können Sie es gerne nutzen könnten Setter. public void setLocationLogic (StandortLogikstandortLogik) { this.locationLogic = locationLogic; } – Kishirada

+2

Die Nachricht ist ziemlich klar. Ein Lambda ist eine Instanz einer funktionalen ** Schnittstelle **. LocationLogic ist eine ** Klasse **. Veranlassen Sie, dass Ihr Setter ein Logic-Argument und kein LocationLogic verwendet. –

+0

Also was muss ich ändern ...? – Kishirada

Antwort

2

Sie erhalten diesen Fehler, weil Sie nur lambdas von funktionalen Schnittstellen erstellen können, w hich bedeutet nur eine Schnittstelle mit genau eineabstract Methode.

Jetzt erwartet Ihre setLocationLogic eine LocationLogic (eine Klasse) und Java verbietet die Erstellung von Lambdas aus Klassen. Deshalb funktioniert Ihr erster Ausschnitt, aber Ihr zweiter nicht.

Ändern Sie entweder die Signatur setLocationLogic in setLocationLogic(Logic logic).

Oder vielleicht einen Konstruktor in LocationLogic erstellen, die einen boolean akzeptiert, die Sie dann in der implementierten Funktion zurück:

l.setLocationLogic(new LocationLogic(false)); 
Verwandte Themen