Android N jack编译器中的lambdas是否包含对封闭类的引用?

Roh*_*uva 6 lambda android java-8

与匿名内部类不同,Java 8 lambdas不包含对封闭(父)类的引用.Android N 增加了对lambdas的支持.

但是,它们是在Jack编译器中使用匿名内部类实现的,以实现向后兼容性,如链接中的注释所述.

这是否意味着使用Jack(而不是retrolambda)编译的Android类中的lambdas将保留对封闭类的引用?

我知道很多人对lambdas感到兴奋的一个原因是在使用它们时要避免FragmentActivity泄漏,但粗略地看一眼,看起来使用jack编译器不会带来这样的好处.

Ste*_*bel 5

我认为"匿名类"这个短语不应该在字面上解释得太多.根据我的理解,他们唯一要告诉我们的是Jack在编译时生成类(而不是Java 8的运行时方法).

从JackIrBuilder代码我猜测生成的IR看起来非常类似于retrolambda生成的字节码.

Jack似乎创建了一个包含封闭类型的lambda主体的合成方法,并且仅在需要它的情况下,即在捕获封闭实例的成员时,将封闭实例的引用传递给生成的类'构造函数.

参考:https://android.googlesource.com/toolchain/jack/+/0af676c4779c5b55fb321f491811516f3d74ed93/jack/src/com/android/jack/ir/impl/JackIrBuilder.java

因此,根据我的理解,答案是:只有当需要从封闭实例中捕获某些内容时.