I’ve been looking over Chapter 18 (thanks Dan!) and it seems that we are almost 
there to defining inference to work properly for values and erased generics. 

There is already a _null type_, and we’ve defined it so that for every 
reference type R, Null <: R (JLS 4.10.). In order to make inference work for 
nullable values, we need to state that for a zero-default value type V:

    Null <! V
    Null <: V?

and that LUB(V, Null) = V?

When we gather constraints in 18.1, in addition to adding the upper bound on 
alpha, we also add in lower bounds Null <: alpha_i for erased type vars.  

We adjust 18.4 to not consider Null to be a proper lower bound for purposes of 
resolution.  

Simple example:

    Point p;
    var v = new Box<>(p);

We gather bounds alpha <: Object (from the declaration of Box<T>), Point <: 
alpha (from the argument), and Null <: alpha (T is an erased type var), yielding

    Null, Point <: alpha <: Object

By 18.4, alpha = LUB(Point, Null) = Point?.  

Obviously this is only one example, and there’s a bunch of work to thread this 
all the way through Ch18 (good luck Dan!), but it seems to me that the 
underpinnings are here already.  


Reply via email to