JEP 186: Collection Literals
Klaus Malorny
Klaus.Malorny at knipp.de
Tue Jan 14 12:28:24 PST 2014
On 14.01.2014 20:33, Paul Benedict wrote:
> The other reason I prefer a unified syntax is so other types can
> participate in the syntax. Brian alluded to this first (kudos). I had this
> mind when I wrote my email (but didn't know such liberal uses were being
> entertained), and it would really be nice to allow such things. Then we can
> use such constructs for three-value tuples, n-value tuples, etc.
>
Hi,
originally, I did not want to interfere the expert round with my layman ideas
any further, but I changed my mind, at least for the this next e-mail ;-). I
hope it is thematically not too far away from Brian's desires.
Well, one could define a generic syntax that can represent at least list-style
and map-style data sets. These are translated by compiler into calls to a
builder interface that is somehow provided by the desired type, e.g.
List<String> list = ArrayList#["a", "b", "c"];
is translated into:
ListBuilder<ArrayList<String>> lb = Internal.magicFunction (ArrayList.class);
// uses information from annotations to ArrayList
// or whatever in order to construct
// ListBuilder instance
lb.start (); // maybe with # elements to ease resource allocation
lb.add ("a"); // maybe with multi-argument methods instead
lb.add ("b");
lb.add ("c");
list = lb.getObject (); // result must be of type ArrayList<String>
This would avoid the limitation of the literals to the Java Collection Framework.
Syntax-wise, some automatic simplifications could be applied for multi-level
structures, e.g. a list of sets:
List<Set<Integer>> list = ArrayList#[HashSet#[1, 2, 3], [2, 3, 4], [3, 4, 5]];
^ ^ ^
0 1 2
i.e. for the element 1, the preceding type of element 0 would be reused, which
is HashSet, and the same applies to element 2. If no type is given at all, a
Java specific well-defined type is used (e.g. HashSet, ArrayList, HashMap),
derived from the type on the lhs.
As an alternative, the outer list builder (see above) could provide a
subordinate builder if no explicit builder is defined for an element. However,
this would likely reduce the flexibility and maybe also hard to perform some
compile time type checks. I guess nobody would like to see e.g. an
"OperationNotSupported" or a "ClassCastException" exception from a literal
construct. It would also be quite intransparent to the developer who uses the
literal.
But I have to admit that I am not really convinced of my own ideas...
Regards,
Klaus
More information about the lambda-dev
mailing list