alternatives or complements to layers

Peter Levart peter.levart at gmail.com
Wed Jan 7 13:43:27 UTC 2015


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