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