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

我用java8创建了一个简单的界面。 因为它包含一个方法和一个默认方法。

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

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

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

}

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

 check.activate(() -> { dummy(); }); 

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

它无法完成。

JLS 15.27.2解决了这个问题:

与出现在匿名类声明中的代码不同,名称的含义以及出现在lambda主体中的this和super关键字以及引用声明的可访问性与周围上下文中的相同(除了lambda参数引入新名称)。

lambda表达式主体中的这个(显式和隐式)的透明度 – 也就是说,将其视为与周围上下文相同 – 允许实现更灵活,并防止身体中非限定名称的含义依赖关于重载决议。

实际上, lambda表达式需要谈论自己 (要么递归地调用自身还是调用其他方法是不寻常的 ,而更常见的是想要使用名称来引用封闭类中的内容。否则被遮蔽(this,toString())。 如果lambda表达式需要引用它自己(就好像通过这个),则应该使用方法引用或匿名内部类。

内部类实现起作用,因为代码被调用,就好像你编码:

 check.activate(new Lambda() { @Override public void yummy() { this.dummy(); } }); 

我们现在的问题是lambdas没有引入新的范围。 因此,如果您希望lambda能够引用自身,您可以优化@FunctionalInterface,使其function方法接受自身及其所需的参数:

 check.activate(this_ -> this_.dummy()); 

其中Lambda定义为:

 @FunctionalInterface public interface Lambda { void yummy(Lambda this_); default void yummy() { yummy(this); } default void dummy(){ System.out.println("Call this.."); } } 

如果我理解正确的话。 您正尝试通过lambda实现在接口中调用默认方法。 我认为可以做到。

 @FunctionalInterface interface Value { String init(Value a); default String add(String b) { return "added content "+b; } default String getResult() { String c = init(this); return c; } } public class Main { public static void main(String[] args) { Value v = a -> a.add("inpout"); // here I am calling add method in Value interface. String c = v.getResult(); System.out.println(c); } }