相关疑难解决方法(0)

为什么我们不能在lambda表达式中使用默认方法?

在Java 8上阅读本教程,其中作者展示了代码:

interface Formula {
    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后说

无法从lambda表达式中访问默认方法.以下代码无法编译:

Formula formula = (a) -> sqrt( a * 100);
Run Code Online (Sandbox Code Playgroud)

但他没有解释为什么不可能.我运行了代码,它给出了一个错误,

不兼容的类型:公式不是功能接口`

那么为什么不可能或错误的含义是什么?该接口满足具有一种抽象方法的功能接口的要求.

java lambda interface java-8 default-method

42
推荐指数
3
解决办法
7698
查看次数

lambda可以访问其目标功能接口的成员吗?

我用java8创建了一个简单的接口.因为它包含一个方法和一个默认方法.

interface Lambda{

default void dummy(){
    System.out.println("Call this..");
}

void yummy();
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用历史方式这两种方法

public class DefaultCheck {

public static void main(String[] args) {

    DefaultCheck check = new DefaultCheck();
    check.activate(new Lambda() {

        @Override
        public void yummy() {
            dummy();
        }
    });

}

void activate(Lambda lambda){
    lambda.yummy();
}
Run Code Online (Sandbox Code Playgroud)

}

现在我正在尝试使用lambda表达式实现相同的东西,得到像"dummy is undefined"这样的错误

check.activate(() -> {
        dummy();
    });
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议,如何使用Lambda表达式实现这个场景?

java lambda java-8

16
推荐指数
2
解决办法
1426
查看次数

为什么不能将@FunctionalInterface应用于SAM抽象基类

我刚刚开始学习Camel,我看到的第一件事就是

    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("file:data/inbox?noop=true").to("file:data/outbox");
        }
    });
Run Code Online (Sandbox Code Playgroud)

我(合理地恕我直言)尝试替换

    context.addRoutes(()->from("file:data/inbox?noop=true").to("file:data/outbox"));
Run Code Online (Sandbox Code Playgroud)

但那是无效的.

当我挖掘时,我发现lambdas适用于功能接口(如果接口符合条件,则暗示)但@FunctionalInterface注释只能应用于接口(足够公平)并且据我所知,没有抽象类的等效注释.当然,RouteBuilder是一个抽象类.

为什么lambdas仅限于接口?

界面和类之间的本质区别是什么使"功能类"不安全/不可预测/不合理?

我可以理解是否有一些限定符,例如抽象方法必须公开,但我无法解释为什么上述是不合理的.

java-8 functional-interface

12
推荐指数
3
解决办法
1045
查看次数