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.