Re: Get the parameterized type of a subclass
Roedy Green wrote:
On Sat, 21 Jul 2007 09:08:53 -0700, cdvr <codecraig@gmail.com> wrote,
quoted or indirectly quoted someone who said :
What I'd like to get is the type "Blah"....how can I get that Type or
reference to the Class object at run-time?
Type erasure says you can't. That information is erased at compile
time. It is strictly for compile-time checking.
Not all information about generics is being erased at compile time.
see http://mindprod.com/jgloss/generics.html
You probably will need to update a bit your valuable glossary page,
because not the whole true is there.
There is a lot of generic information preserved for runtime in a class
files. In particular, there is a full information about generic
declaration preserved. Type erasure, in general, affects a direct use
of a generic types in a code only. (Of course, the method declarations,
and many others language elements are affected also, but that's not
important here I think).
For example, if you put the following line into some method body:
List<String> list = new ArrayList<String>();
there is no information at runtime that a String is the actual type
argument for both List, and ArrayList.
But when you put the above line into a class' declaration body (making a
field), then the information about actual the type argument type of a
List is preserved in that field declaring class file
(Field.getGenericType() allows to access it).
There is still no full information preserved about actual type argument
used for ArrayList. However, we can preserve that info also in
ArrayList subclass declaration (that's what the OP did).
So when we change our field declaration to:
List<String> list = new ArrayList<String>() {};
There is all information about List and ArrayList actual type arguments
present at runtime (retrievable the way demonstrated in my previous post
to this thread).
Type erasure was done to make generics easy for the JVM makers to
implement. It also hoped for strict compatibility with JDK 1.4.
The type erasure was mainly designed to allow binary backward
compatibility. The generic information already preserved do not breaks
that. There was not clear idea previously on how to add more info
without breaking the compatibility. But now we have the Neal Gafter's
proposal (mentioned in my previous post) to allow fully reified generic
types to coexist with these that we have currently, still without
breaking binary backward compatibility.
For more details see:
http://gafter.blogspot.com/2006/11/reified-generics-for-java.html
http://tech.puredanger.com/java7#reified
piotr