【问题标题】:Java - Can't use lambda for self made interface - Target type of lambda conversion must be an interfaceJava - 不能将 lambda 用于自制接口 - lambda 转换的目标类型必须是接口
【发布时间】:2017-12-29 16:44:47
【问题描述】:

我有以下代码:

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

【问题讨论】:

  • 这只是一个简单的二传手。公共无效 setLocationLogic(LocationLogic locationLogic) { this.locationLogic = locationLogic; }
  • 信息很清楚。 lambda 是函数式接口 的一个实例。 LocationLogic 是一个。让你的 setter 将 Logic 作为参数,而不是 LocationLogic。
  • 所以我要改变的是...?
  • 让你的 setter 将逻辑作为参数,而不是 LocationLogic。
  • 感谢工作!

标签: java intellij-idea lambda


【解决方案1】:

您收到此错误是因为,您只能从功能接口创建 lambdas,这仅表示具有完全 一个 abstract 方法的接口。

现在您的setLocationLogic 需要LocationLogic(一个类),而java 禁止从类创建lambda。这就是为什么您的第一个 sn-p 有效,但您的第二个无效的原因。

要么将setLocationLogic的签名更改为setLocationLogic(Logic logic)

或者可以在 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多