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