Bill: Yes, and no. It's complicated.

Generics could show up in 3 places:

Types, Signatures, and Objects.

Generics are not, are definitely, and are kind of, erased,
respectively, in those 3 places. To be specific:

Generics information from TYPES is not, and has never been, erased. If
you write:

public List<String> foobar; //this is a field.

then the fact that foobar is a List<String> is available in the class
file, and even available via reflection if you use the right methods
(which are admittedly very awkward, but you can get it with some
effort).

Generics information from SIGNATURES is erased.

If you write:

public void foobar(List<String> x) {}
public int foobar(List<Integer> x) {}

javac will not even compile it, eventhough normally 2 methods with
different parameter lists are separate even if they share a name.
That's because internally, generics isn't encoded in a method
signature. In java, method names are expanded with their parameter and
return type, so the above would become:

com.package.ContainingClass.foobar(Ljava/util/List;V)
com.package.ContainingClass.foobar(Ljava/util/List;I)

which is not okay - being only different in return type is not
allowed. This isn't a big concern and is not generally covered by what
is meant with 'we should reify generics', but its important to know
that this can pretty much never be fixed without serious overhauling
of the JVM.

Generics information from OBJECTS is erased, but this is a JVM thing:
If you write:

new ArrayList<String> foobar;

then what actually happens is that you just create an ArrayList. Yes,
javac does not encode the <String> part of it in the classfile (you
couldn't even if you wanted to; you can't put annotations there and
there's no JVM directive to state generics parameters when
constructing an object), but other than this lack of encoding
parameters when calling methods / constructors, the JVM is perfectly
free, in a future version, to start tracking this stuff. For example,
in the statement:

List<String> foo = new ArrayList<String>();

what can actually be recovered by the JVM at runtime is this:

List<String> foo = new ArrayList();

In that situation, the only possible legal construction that can show
up on the right hand side is <String>, so a future JVM could in theory
attach this to the object instance and make that "String" relation
retrievable via a new addition to the reflection API. Things get more
difficult in situations like:

List<? super Double> foo = new ArrayList<Number>();

Here the compiler really can't infer the 'Number' on the RHS from the
generics signature on the LHS (which is the only thing a java v1.5 or
1.6 class file carries inside it) - it knows it has to be either
Number, or Double, or Object, or Serializable. Those are the only four
options. But which one of those is it?


This boils down to objects not being part of the class file
architecture; objects are created by the runtime itself. Class files
merely  contain the code that explains to the runtime how and when to
create them. So, the answer for this last one is 'it's complicated'.


On Jan 14, 3:39 pm, Bill Robertson <billrobertso...@gmail.com> wrote:
> I can see that for "obsolete" libraries, but I have trouble seeing
> that happening for reified generics.  Don't reified generics start at
> compile time?  i.e. is the type erasure is done by javac?  If so, I
> don't see how a modular runtime could help.
>
> On Jan 12, 8:27 am, Jess Holle <je...@ptc.com> wrote:
>
> > Weiqi Gao wrote:
> > > Now that the Java 7 feature set has been redefined and (provisionally
> > > and non-bindingly) finalized (again), and my (and I think a lot of
> > > others') favorite features are not in it, I think it's time to start
> > > compile a wish list for Java 8 and Java 9.
>
> > > Here's mine:
>
> > > Java 8:
>
> > >    Reified generics
> > >    Removal of dead features (java.awt.Button, etc.)
>
> > A large benefit of modularization ala Jigsaw is that you don't have to
> > remove stuff like this (which you really can't without breaking a lot of
> > applications).  Instead it goes into an obsolete/deprecated module which
> > you just never load if you don't use it.
>
> > Ideally Javadoc gets updated to hide such cruft by default as well.
>
> > Then you get the best of both worlds -- nothing breaks, but you don't
> > have to pay for cruft in any real sense.
>
> > --
> > Jess Holle
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "The 
Java Posse" group.
To post to this group, send email to javaposse@googlegroups.com
To unsubscribe from this group, send email to 
javaposse+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/javaposse?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to