2017-12-29 47 views
0

나는 다음과 같은 코드가 있습니다자바 - 자기 만든 인터페이스에 대한 람다를 사용할 수 없습니다 - 람다 변환의 대상 유형은 인터페이스해야

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

그 방법을 세터. public void setLocationLogic (LocationLogic locationLogic) { this.locationLogic = locationLogic; } – Kishirada

+2

메시지가 분명합니다. 람다는 기능 ** 인터페이스 **의 인스턴스입니다. LocationLogic은 ** 클래스 **입니다. 당신의 세터가 ArgLogic이 아닌 Logic 인수를 취하도록하십시오. –

+0

그래서 내가 바꾸어야 할 것은 ...? – Kishirada

답변

2

기능적 인터페이스에서 lambdas 만 만들 수 있기 때문에이 오류가 발생합니다. w 단지 정확히 하나의 인터페이스를 의미합니다abstract 메서드.

이제 setLocationLogicLocationLogic (클래스)을, java는 클래스에서 람다 생성을 금지합니다. 첫 번째 발췌 문장이 작동하는 이유가 있지만 두 번째 발췌 문장은 그렇지 않습니다.

setLocationLogic의 서명을 setLocationLogic(Logic logic)으로 변경하십시오.

아니면 다음 구현 된 함수에서 반환 부울, 받아 LocationLogic의 생성자를 만들 :

l.setLocationLogic(new LocationLogic(false));