关于JDK lambda表达式与匿名内部类的等价实现却出现了截然不同的结果原因分析

发现了一个很奇怪的现象,先上代码:

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调用与外部类有相同签名的方法是,实际调用的是外部类实例的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值