Java-Can';t将lambda用于自制接口-lambda转换的目标类型必须是接口

Java-Can';t将lambda用于自制接口-lambda转换的目标类型必须是接口,java,intellij-idea,lambda,Java,Intellij Idea,Lambda,我有以下代码: public interface Logic { boolean logicAccesscible(); } public class LocationLogic implements Logic { @Override public boolean logicAccesscible() { return true; } } 但当我尝试使用lambda创建LocationLogic对象时,它根本不起作用 l.

我有以下代码:

public interface Logic
{

    boolean logicAccesscible();
}


public class LocationLogic implements Logic
{
    @Override
    public boolean logicAccesscible()
    {
        return true;
    }
}
但当我尝试使用lambda创建LocationLogic对象时,它根本不起作用

    l.setLocationLogic(new LocationLogic()
    {
        @Override
        public boolean logicAccesscible()
        {
            return false;
        }
    });
那只鹬很管用,但是

l.setLocationLogic(() ->
    {
        return false;
    });
给出错误“lambda转换的目标类型必须是接口”

是的,我试着使用:

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

之所以会出现此错误,是因为您只能从函数接口创建
lambda
,这意味着只有一个
abstract
方法的接口

现在,您的
setLocationLogic
需要一个
LocationLogic
(类),java禁止从类创建lambda。这就是为什么您的第一个代码片段有效,而您的第二个代码片段无效

setLocationLogic
的签名更改为
setLocationLogic(逻辑)

或者在LocationLogic中创建一个接受布尔值的构造函数,然后在实现的函数中返回:

public class LocationLogic implements Logic{
    private final boolean accessible;

    public LocationLogic(boolean accessible){
        this.accessible = accessible;
    }

    public boolean logicAccessible(){
        return accessible;
    }
}
这样你就可以像这样使用它:

l.setLocationLogic(new LocationLogic(false));

这只是一个简单的二传。public void setLocationLogic(LocationLogic LocationLogic){this.LocationLogic=LocationLogic;}消息非常清楚。lambda是功能接口的实例。LocationLogic是一个类。让你的设定者以逻辑作为论据,而不是位置逻辑。所以我要改变的是?让你的设定者以逻辑作为论据,而不是位置逻辑。谢谢你的工作!