Not recursive lambda works like recursive lambda.
bitter_fox
bitterfoxc at gmail.com
Fri Feb 24 07:51:42 PST 2012
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