peter
Howard Lovatt
howard.lovatt at iee.org
Tue Feb 9 15:17:39 PST 2010
This proposal:
http://www.artima.com/weblogs/viewpost.jsp?thread=278567
Would allow:
#Object(String)[] array = new #String(Object)[10];
It would be translated into:
_Callable_Object_String[] array =
_Array_From_String_Object__To_Object_String.instance( new
_Callable_String_Object[10] );
A more interesting example is:
final #String(Object)[] sols = new #String(Object)[1];
sols[0] = #String(final Object o)(o.toString());
final #Object(String)[] osls = sols;
System.out.println("osls[0].(\"Hello\") = " + osls[0].("Hello"));
Which is translated to:
final _Callable_String_Object[] sols = new _Callable_String_Object[1];
sols[0] = new _Callable_String_Object() {
@Override public String call(final Object o) { return o.toString(); }
};
final _Callable_Object_String[] osls =
_Array_From_String_Object__To_Object_String.instance( sols );
System.out.println("osls[0].(\"Hello\") = " + osls[0].call("Hello"));
_Array_From...'s instance method does all the necessary translation -
see reference above for details. To give an idea of the scheme, the
relevant 'From' classes are:
public final class _Array_From_String_Object__To_Object_String {
public static _Callable_Object_String[] instance(final
_Callable_String_Object[] from) {
if (from == null) { return null; }
final _Callable_Object_String[] to = new
_Callable_Object_String[from.length];
for (int i = 0; i < from.length; i++) { to[i] =
_From_String_Object__To_Object_String.instance(from[i]); }
return to;
}
}
public final class _From_String_Object__To_Object_String extends
_Callable_Object_String implements Wrapper {
private final _Callable_String_Object f;
private _From_String_Object__To_Object_String(final
_Callable_String_Object f) { this.f = f; }
public static _From_String_Object__To_Object_String instance(final
_Callable_String_Object from) {
if (from == null) { return null; }
final _Callable_String_Object f =
(_Callable_String_Object)Wrappers.unWrap(from);
return new _From_String_Object__To_Object_String(f);
}
@Override public Object call(final String a1) { return f.call(a1); }
@Override public Object getWrappee() { return f; }
@Override public int hashCode() { return f.hashCode(); }
}
Also see reference for actual type names, _Callable_... are a
simplification to allow easy testing of the idea, and the relevant
classes, _Callable... and 'From' are dynamically generated by the
class loader.
-- Howard.
More information about the lambda-dev
mailing list