Thanks for the example Dan, this "Object[] objs = arr; // just like Point[] <: Object[]" makes it very clear. Brian's response makes more sense to me now.
> From: Dan Smith <daniel.sm...@oracle.com> > To: Tobi Ajila <tobi_aj...@ca.ibm.com> > Cc: Brian Goetz <brian.go...@oracle.com>, valhalla-spec-experts > <valhalla-spec-experts@openjdk.java.net>, valhalla-spec-experts > <valhalla-spec-experts-boun...@openjdk.java.net> > Date: 2020/06/19 01:32 PM > Subject: [EXTERNAL] Re: Evolving the wrapper classes > > > > On Jun 19, 2020, at 11:07 AM, Tobi Ajila <tobi_aj...@ca.ibm.com> wrote: > > > > I am still a little unclear as to what the motivation is for this. > Is this solely for specialized generics? > > > > In Dan's examples with `I` and `java/lang/Integer$val`, the only > places where conversions are needed are when primitives are used as > type parameters or to call instance methods on them, both of which > can already be done with primitive arrays. So in the LW3 - LW20 > timeframe would we have any need for these conversions? If so, could > you provide some examples? > > I think it comes down to specialization and subtyping. > > Pre-specialization, here's one example that uses subtyping: > > int[] arr = { 1 }; > Object[] objs = arr; // just like Point[] <: Object[] > Object obj = objs[0]; > Integer i = (Integer) obj; > > This would compile to something like: > > iconst_1 > newarray T_INT > dup > iconst_0 > iconst_1 > iastore > astore_0 > > aload_0 > astore_1 > > aload_1 > iconst_0 > aaload > astore_2 > > aload_2 > checkcast java/lang/Integer > astore_3 > > Going in the other direction—allocating a [Qjava/lang/Integer; and > then using iaload/iastore on it—may not be necessary unless/until > the language supports "new T[]" in specialized code, but it > tentatively makes sense to support now anyway, rather than having to > come back and fix it up later. > > > In the case of specialized generics, is the intention that `[I` > (and I suppose `I` as well) will appear in generic code? > > If you mean "can '[<T>' be specialized to '[I'?", the answer is no. > The primitive types cannot act as type arguments.