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