发现了一个很奇怪的现象,先上代码:
public interface A {
int f();
default A cf(A other){
return new A(){
@Override
public int f() {
int i = this.f();
return i!=0? 1:other.f();
}
};
}
}
然后进行测试:
public class B {
public static void main(String[] args) {
A a1 = new A() {
@Override
public int f() {
return 6;
}
};
System.out.println(a1.f());
A a2 = new A() {
@Override
public int f() {
return 0;
}
};
a1.cf(a2).f();
}
}
结果是栈溢出,因为a1.cf(a2).f();这句执行时导致A接口中的默认函数中的这句:int i = this.f();
出现了无限自己调用自己的递归
然后我把A接口进行修改,用lambda表达式代替:
public interface A {
int f();
default A cf(A other){
return ()->{
int i = f();
return i!=0?1:other.f();
};
}
}
结果就会正常执行
这段lambda表达式和匿名内部类是等价的,却导致了不同的结果
区别之一:
匿名内部类使用无限定的this,这个this指的就是该匿名内部类对应的实例。
而lambda表达式使用无限定的this,这个this却是外部类的实例。
有限定的this即指定某个外部类的this,无限定就是没有指定是哪个外部类的this。
区别之二:
匿名内部类内调用与外部类有相同签名的方法是,实际调用的是该匿名内部类实例的方法。
而lambda调用与外部类有相同签名的方法是,实际调用的是外部类实例的方法。