alternatives or complements to layers
Peter Levart
peter.levart at gmail.com
Wed Jan 7 15:37:20 UTC 2015
On 01/07/2015 04:22 PM, Maurizio Cimadamore wrote:
> 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.
Ok, I buy that, but it would mean that existing core libraries would
have to get a massive update.
>
> 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?
It was said that an option is for all value types (including primitives)
to get 3 Object methods (hashCode, equals, toString). So at least
println is doable.
Regards, Peter
>
> 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