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);
   
}
  
}