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)
但他没有解释为什么不可能.我运行了代码,它给出了一个错误,
不兼容的类型:公式不是功能接口`
那么为什么不可能或错误的含义是什么?该接口满足具有一种抽象方法的功能接口的要求.
我用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表达式实现这个场景?
我刚刚开始学习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仅限于接口?
界面和类之间的本质区别是什么使"功能类"不安全/不可预测/不合理?
我可以理解是否有一些限定符,例如抽象方法必须公开,但我无法解释为什么上述是不合理的.