generic List traversal and VT/VO compatibility
Thomas W
twhitmore.nz at gmail.com
Mon Jan 26 03:00:42 UTC 2015
Hi Stephane, Stephen, Vitaly,
The issue at hand (in this thread) is about iterating over opaque lists (or
> any iterable, for that matter). The crux of the issue is that what fits
> most naturally with any-fied generics, <any T> void iterate(List<T> ...),
> is today being written using List<?>. And one of the (predominant?)
> reasons that's used today is because of late-binding/reflection where the T
> isn't known at compile time. I don't think anyone is claiming there's any
> subtype relationship between List<int> and List<?> from an OO perspective.
>
I am not fully clear why we can't fit "reasonable" generic traversal &
processing of List<int>/ List<value>into the existing language scheme.
We can fairly consider an interface "List<? extends Object>" to mean _a
List of items coercable to Object._ As an interface, this merely specifies
that the Items can be accessed via an "Object" reftype API.
This is perfectly possible for List<int> to implement -- primitives &
value-types can (and for generality, should) offer a boxed API. This gives
general iteration/ compatibility "for free", out of the box. Internally
bridge methods would be used.
When we write specific type-code against List<int> or List<valuetype>,
these would still be nominally compatible with List<?> but the more
efficient type-specific methods would be bound.
So efficiency would be highest for type-specific code, but generality would
be be preserved via List<?> including all List<primitive>, List<valtype>.
Efficiency of generic iteration of primitive/ valtype would be similar to
today's boxed lists.
An important point on types & type relations:
- There should presumably be some relationship in the type system between
List<int> and List<?>.
- This is not a proper "supertype/subtype" relationship. List<int> is a
narrowing of List<?>, rather than a real subtype.
- We could consider it as a "specializes" or "reifies/generalizes"
relation.
- We should not try to treat/ or consider this relation as something it is
not, as our conclusions/ results may likely be incorrect. (in regard of
design)
I can still imagine updating the language, such that List<?> now
effectively meant "List<any>". Boxing would be automatic and implicit to
fill in the gaps. Some improvement to method-selection & despatch rules
might be required.
So: "<?>" would now mean "<any cooercable to Object>".
List<?> would declare:
Object get (int index)
void add (Object item)
List<int> would declare:
int get (int index)
void add (int item)
and expose as bridges:
Object get (int index)
void add (Object item)
Existing framework code should almost totally "just work" -- with similar
performance to today -- via the boxed APIs. Hopefully, having clear &
meaningful "specializes/generalizes" type relation would help framework
code in future to do even better.
Question: can Java method despatch be tweaked/ enhanced to achieve the
above?
----------
Last point: Interface "compatibility" may conceivably be easier/ more
possible, than the same thing for classes. I don't know if this a solid
conclusion or just instinct, prompted by two things:
- the avoidance of concrete class implementation inheritance (T[] elements),
- greater flexibility of interface method-dispatch.
For this reason I am proposing the relation for interface types, as a
starting point.
Regards
Thomas Whitmore
More information about the valhalla-dev
mailing list