Why JVM can not type infer type params but javac can do?

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Jan 8 11:35:40 UTC 2015


On 08/01/15 08:54, Ali Ebrahimi wrote:
> Hi, maybe this is stupid question, but want to ask and what is requirements
> for this?
>
> Array instantiation sample:
> public <any T> T[] newArray(int){
>          return new T[0];
> }
>
> even for non-any T:
> public <T> T[] newArray(int){
>          return new T[0];
> }
>
> With thousands number of optimization and inlining mechanics equipped in
> jvm, What is the reasoning behind not allowing to jvm to be aware of
> generics info emitted in classfilles?
>
> Why jvm should not able do following inlining?
>
> String[] strs =  newArray(int) => String[] strs = new String[0];
> I mean even in jitted code.
>
> I think some time ago I read some papers in similar area.
Well, you probably don't want the types of your arrays to change 
depending on mere optimizations; the type of the array is important - if 
it's Object[] then you can stuff anything you like into it and the VM 
will not bark; but if it's String[] then the VM will be much more 
paranoid about it. And you can't have a program that runs correctly or 
fails depending on which kind of optimizations have been applied.

So, the question maybe is: why doesn't the VM do all the type lifting 
that is required in order to figure out that T means String? Well, one 
good reason is that answering such question is not simple and it 
involves a lot of type-system machinery - which the compiler already 
has. If we were to replicate this logic in the VM, it will turn out to 
be a maintenaince pain - as we will have then to worry to keep javac and 
the JVM type-system routines in sync. Since javac has all the info (as 
your email subject suggests), it is way more straightforward to just add 
an 'hint' that tells the VM how to reconstruct the type of T. Also, 
other languages might have different ideas of how inference should be 
performed and find the java-like behavior too strict/or simply insufficient.

Maurizio



More information about the valhalla-dev mailing list