"Model 2" prototype status

Rémi Forax forax at univ-mlv.fr
Sun Aug 2 19:52:16 UTC 2015

Le 1 août 2015 23:48:07 CEST, Brian Goetz <brian.goetz at oracle.com> a écrit :
>> I dislike the Foo<ref> / Foo<any> thing for several reasons.
>Not surprising.  This wasn't our first choice either.
>We spent a great deal of effort investigating whether it was possible
>re-use Foo<?> to mean Foo<ref> when the corresponding tvar is a ref 
>tvar, and to mean Foo<any> when the corresponding tvar is an any tvar. 
>Seems obvious, right?

It's not what i propose.
Foo<any> is Foo<any>.
Foo<ref> is Foo<?> because if Foo<?> is used in a 1.10 class file it's a reified type and if Foo<?> is used in a 1.9 class the compiler considers that is not reified and disallow to cast by example a Foo<any> to a Foo<?>. Practically, in that case, a user can use something similar to a checked collection that will check at runtime that each value have the right class.

>Several hundred hours later, the short answer is that things fall apart
>when a library is any-fied and the client is not recompiled; this would
>make any-fication a binary-incompatible change, which would be a loser.
> So with tears in our eyes, we reluctantly concluded that we needed to 
>differentiate between Foo<ref> and Foo<any>.  Once we swallowed that 
>pill, many things snapped into place.  So as sad as it is to have two 
>kinds of wildcard, I'm pretty sure its the right call.

I understand the need of differenciating between Foo<ref> and Foo<?> but i hope that instead of having to explain that to each Java dev, we can explain that only to the few that will stumble on the issue.

>You prefer another syntax?  Sure, I'm sure there are alternatives.  We 
>can talk about it -- but not this year!  We have way more important 
>things to work out before that comes anywhere near the top of the list.

I don't care about the syntax but the one you propose doesn't help IMO.

>As to bounds...  we're still working out the details of the interaction
>between value types and interfaces.  So its quite possible that Foo<any
>T extends Comparable> may in fact be meaningful.  (And if that's the 
>case, primitives might join the party too.)  Or not, we're not sure

yes, forget the interfaces,
i suppose that it's not a big deal to not try to support them until you want to introduce value types in a later release :(


More information about the valhalla-dev mailing list