Static fields in specialized classes

David Holmes david.holmes at oracle.com
Tue Oct 14 04:12:48 UTC 2014


On 14/10/2014 4:19 AM, Brian Goetz wrote:
> We stumbled across a few issues regarding static fields in specialized
> classes in the prototype.  There seems to be a reasonably
> straightforward solution but it does touch quite a number of things.
>
> Consider:
>
> class Foo<any T> {
>      public final static int x = System.currentTimeMillis();
> }
>
> Regardless of whether our implementation is by specialization or erasure
> (or both), logically there is just *one* field 'x' for any instantiation
> Foo<T>.

Having read the rest of the thread the premise here is that there is 
only one generic class regardless of how many generic types; and as 
statics are associated with a class it follows there is one static field 
shared across all those types. It's a sound, compatible view of the 
world. Of course people may ask for a per-specialization "static" field 
mechanism.

Does this mean that for each specialization getClass()/.class return 
different Class objects (ie a Class object per type)? I'll assume yes.

> If we take a naive approach to specialization, where we just copy
> members from Foo<any T> to Foo<int> during specialization, we end up
> with two 'x' fields (wrong).  So the specializer should strip out static
> members during specialization.  (If the base class has static members,
> we also need to add back a clinit member in Foo<int> to force loading of
> base Foo, to ensure that all instantiations of Foo<any T> have a
> consistent view of Foo's statics.)  So then we're done.

Seems to be implementation detail.

> Except for access through instances (yechh).  Here, the compiler needs
> to rewrite any references to f.x (where f is an instance of a
> specialization of Foo) to Foo.x, and we're done.

Didn't we deprecate that yet? :) Arguably javac should do this 
regardless of specialization - though the JLS would have to specify the 
conversion to ensure all javac's comply.

> Except for access control; if x is private, then we get an
> IllegalAccessError on any references to x from within Foo<int> to Foo.x.
>   Which means that Foo<int> has to be loaded as if with a host class of
> Foo.  (Just as defineAnonymousClass supports a host class, classdynamic
> will need to as well.)  So then we're done.

Is this an implementation issue? The access control rules can easily be 
updated to account for specializations and grant them access.

> Except for reflection; reflection on Foo<int>.class should still show
> that it has the same static members as Foo, and in fact they *are* the
> same static members.  So then we're done.

Distinct Class objects seem problematic in this regard. The conceptual 
model of statics being like instance fields of the associated Class 
object breaks down here. A Class object is not really a "class" object 
but a "type" object.

> Except for MH lookup.  Will need to fix that up too.
>
> Any others?

JVM TI and any other VM based introspection mechanisms.

David




More information about the valhalla-dev mailing list