I would like to propose an alternative to the V? syntax we are currently using 
for representing an inline class encoded as a L-type.

I propose to use Coffer<Complex> instead of Complex? (with Complex an inline 
class).

as notice several of us, the V? syntax as several shortcoming:
- as Brian said, using '?' as a character makes a type that mix wildcards and 
V? syntax hard to parse.
- as John said, using ? is misleading because other languages have use ? to 
indicate a nullable type but the Ltype of an inline class is an identityless 
nullable reference (and being an identityless reference is as important as 
being nullable)
- as i tried to say, the syntax V? means that V? is a supertype of V, so 
something that should be preferred to V as type of parameters in methods but we 
don't want to encourage people to write APIs that make heavy use of V? (using 
the words of Brian).


I think that a good alternative is to introduce a new class named 
java.lang.Coffer and makes the compiler to erase Coffer<Complex> to LComplex;
with a mechanism named auto-coffering to go from an inline class to its coffer 
and vice-versa. Note that because auto-coffering is introduced at the same type 
as inline class is introduced in the lange, we are free to specify whatever 
semantics we want for overloaded methods that takes a coffer or its 
corresponding inline type.


Here are the advantage of using java.lang.Coffer
- we can document the exact semantics of a coffer in the javadoc of 
java.lang.Coffer.
- nullability and being a reference comes from free because it's a classical 
class from the user POV.
- it's obvious that if you want to call a method on a value type, you have to 
un-coffer it first which may lead to a NPE at that point.
- because auto-coffering is a conversion, Coffer<Complex> is not a supertype of 
Complex.

There are two oddities:
- while the class java.lang.Coffer exists, you can not have an instance of 
Coffer at runtime, so you have these special rules:
  - java.lang.Coffer.class can exist but it can not be instantiated (like 
java.lang.Void).
  - java.lang.Coffer can not be a raw type and doens't accept any wildcard 
bounded or unbounded, because we don't know how to erase them.
- Coffer<Complex> is a reified type so
  - instanceof Coffer<Complex> and new Coffer<Complex>[42] are ok.

So the main drawback is that a Coffer is a new kind of type with some very 
specific rules. 

RĂ©mi

Reply via email to