class Example {

    interface Foo {
        Number foo(String arg);
    }

    interface Bar { // does not extend Foo, but is compatible
        Integer bar(String arg);
    }

    class A {
        int closure( (String => Number) foo)
        {
            return foo("any string").intvalue();
        }

        int current(Foo foo)
        {
            return foo.foo("any string").intValue();
        }
        int proposed(Foo foo)
        {
            return foo("any string").intValue();
        }
    }
   
    void closures(A a)
    {
        ( String => Integer ) bar = { String arg => arg.length() };
        ( String => Number )  foo = bar;
	
        a.method(foo);
    }

             
    void current(A a)
    {   
        final Bar bar = new Bar() { public Integer bar(String arg) { return arg.length(); };
              Foo foo = new Foo() { public Number  foo(String arg) { return bar.bar(arg); };
                                   
        a.method(foo);
    }

             
    void proposed(A a)a
    {
        final bar = new Bar.bar(String arg) { return arg.length(); }
        var   foo = (Bar as Foo) bar; // extended type cast 
                           
        a.method(foo);
    }
   
}
