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