在 Lambda 表达式中,this 和 super 关键字的行为有些不同于普通的 Java 代码。
- this 关键字
- 在 Lambda 表达式中,this 关键字对应的是 Lambda 表达式所在的函数式接口类型实例。
例如:
public class Foo {
public void doSomething() { ... }
}
Foo f = new Foo();
Consumer<Foo> c = (Foo x) -> x.doSomething();
c.accept(f);
这里的 this 是 Consumer 类型的实例,即 c 变量。
- 如果 Lambda 表达式是声明在某个类的方法中,this 会默认对应该方法的接收者。
例如:
public class Bar {
public void doSomething() {
Consumer<Foo> c = (Foo x) -> x.doSomething();
c.accept(new Foo());
}
}
这里的 this 是 Bar 类的对象,因为 Lambda 表达式在 Bar 类的 doSomething() 方法中声明。
- 如果明确需要访问包围类,可以使用包围类的名称加 this 关键字。
例如:
public class Bar {
public void doSomething() {
...
}
public void method() {
Consumer<Bar> c = (Bar x) -> x.doSomething();
c.accept(Bar.this);
}
}
这里 Bar.this 表示 Bar 类的接收者对象。
- super 关键字
- 在 Lambda 表达式中,super 关键字对应的是函数式接口类型的超类型中的方法。
例如:
interface Foo {
void doSomething();
}
interface Bar extends Foo {
void doAnotherThing();
}
Bar b = () -> {
super.doSomething(); // 调用 Foo 接口的 doSomething() 方法
};
这里 super.doSomething() 调用超接口 Foo 的 doSomething() 方法。