Not recursive lambda works like recursive lambda.
bitter_fox
bitterfoxc at gmail.com
Fri Feb 24 15:56:27 PST 2012
Thank you for the fix.
Regards,
bitter_fox
2012/2/25 bitter_fox <bitterfoxc at gmail.com>
> Hi,
> "SAM sam = () -> () -> sam.invoke()" is not recursive lambda.
> However, if sam is a local variable, sam works like recursive lambda.
>
> // This program was compiled by the newest compiler(revision:1254)
> public class Main
> {
> interface SAM
> {
> SAM invoke();
> }
>
> static SAM field = () -> () -> field.invoke();
>
> public static void main(String[] args)
> {
> SAM local = () -> () -> local.invoke();
>
> field.invoke().invoke(); // Success
> local.invoke().invoke(); // StackOverflowError
> }
> }
>
> This is the dis-compiled code by jad:
>
> // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
> // Jad home page: http://www.kpdus.com/jad.html
> // Decompiler options: packimports(3)
> // Source File Name: Main.java
>
>
> public class Main
> {
> static interface SAM
> {
> public abstract SAM invoke();
> }
>
> public static void main(String args[])
> {
> SAM sam = new SAM() {
> public SAM invoke()
> {
> return new SAM() {
> public SAM invoke()
> {
> return invoke(); // call not sam.invoke() but
> this.invoke()
> }
>
> final _cls2 this$0;
>
> {
> this$0 = _cls2.this;
> super();
> }
> };
> }
> };
> field.invoke().invoke();
> sam.invoke().invoke();
> }
>
> static SAM field = new SAM() {
> public SAM invoke()
> {
> return new SAM() {
> public SAM invoke()
> {
> return Main.field.invoke();
> }
>
> final _cls1 this$0;
>
> {
> this$0 = _cls1.this;
> super();
> }
> };
> }
> };
> }
>
> Regards,
> bitter_fox
>
>
More information about the lambda-dev
mailing list