alternatives or complements to layers
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Wed Jan 7 15:22:40 UTC 2015
Hi Peter,
I found this often too (and it is frustrating!) when trying to apply
some of the valhalla magic on our collection classes (the case I found
was System.arraycopy, which suffers from similar issues). I believe the
pain we are feeling now is both (a) benign and (b) transient. It is
benign because, in one way, it makes you see how 'old' the API look once
you fullt embrace the idea of a unified type-system; if we were writing
this from scratch, println would probably something like:
<any Z> void println(Z z);
And then it would be implemented by parts using peeling.
The 'transient' nature of this pain is because we are working with a
unified language, but an erasure-based library; I believe that this
method (and other similar ones) will have to be rewritten (or an extra
'any' variant added) so that they work uniformly with specialized generics.
P.S.
We can just consider the set of overloaded println (Object + primitives)
'good enough' for an 'any X'; what if X is an instance of a value class?
Maurizio
On 07/01/15 13:43, Peter Levart wrote:
> Hi,
>
> While experimenting a bit with the current preliminary prototype, I
> found myself on several occasions wanting to call a method from
> "normal" API. Say System.out.println(x) with an x of type "any T".
> Usually a method that already has various overloads or a method taking
> an Object. Javac refuses:
>
> method PrintStream.println(boolean) is not applicable
> (argument mismatch; T cannot be converted to boolean)
> method PrintStream.println(char) is not applicable
> (argument mismatch; T cannot be converted to char)
> method PrintStream.println(int) is not applicable
> (argument mismatch; T cannot be converted to int)
> method PrintStream.println(long) is not applicable
> (argument mismatch; T cannot be converted to long)
> method PrintStream.println(float) is not applicable
> (argument mismatch; T cannot be converted to float)
> method PrintStream.println(double) is not applicable
> (argument mismatch; T cannot be converted to double)
> method PrintStream.println(char[]) is not applicable
> (argument mismatch; T cannot be converted to char[])
> method PrintStream.println(String) is not applicable
> (argument mismatch; T cannot be converted to String)
> method PrintStream.println(Object) is not applicable
> (argument mismatch; T cannot be converted to Object)
> where T is a type-variable:
> T extends <any> declared in method <T>test()
>
>
> But we know that whatever instantiation of T we choose, at least one
> of available overloaded methods would apply. If the set of overloaded
> methods contains one with parameter of type Object, then any
> instantiation of parameter of type "any T" would apply to at least one
> of those methods. At specialization time, the most appropriate method
> could be "selected".
>
> Of course this would not automatically route reference typed parameter
> to the most appropriate method among those taking various reference
> types - the one taking Object would always be chosen, but any value
> typed paremeter could select the most appropriate method (with
> implicit conversions and/or boxing).
>
> This could be viewed as a more natural complement to "layers" for
> supporting implementation by parts.
>
> The specializer would either have to inspect the target class somehow,
> or javac could provide the set of applicable methods in an attribute
> associated with invocation. Or perhaps, such invocation could be
> "specialized" as invokedynamic where the linking to the most
> appropriate method (with implicit conversions and/or boxing) would be
> choosen at 1st invocation.
>
> What do you think?
>
>
> Regards, Peter
>
More information about the valhalla-dev
mailing list