Raw type other than a Class, possible?

P

Piotr Kobzda

Can someone give an example of a raw type, which is other than a Class
instance at runtime?

In other words, why is the return type of
java.lang.reflect.ParameterizedType.getRawType() a Type, not a Class?

May I expect the ClassCastException in the following code snippet?

ParameterizedType type = ...
Class rawType = (Class)(type.getRawType());


piotr
 
D

Daniel Pitts

Can someone give an example of a raw type, which is other than a Class
instance at runtime?

In other words, why is the return type of
java.lang.reflect.ParameterizedType.getRawType() a Type, not a Class?

May I expect the ClassCastException in the following code snippet?

ParameterizedType type = ...
Class rawType = (Class)(type.getRawType());

piotr

how 'bout you try it and let us know what happens.
 
P

Piotr Kobzda

how 'bout you try it and let us know what happens.

Well, it passes all my tests. Here is one, if you wanna try it also:

<sscce>
import java.lang.reflect.*;
import java.util.*;

public class RawTypeTest {
static List<String> list = new ArrayList<String>();

public static void main(String[] args) throws Exception {
ParameterizedType type
= (ParameterizedType)RawTypeTest.class
.getDeclaredField("list").getGenericType();
Class rawType = (Class)type.getRawType();
System.out.println("raw type of " + type + " is " + rawType);
}
}
</sscce>


In addition to that, I've even checked Sun's implementation of
ParameterizedType
(sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl), and the
getRawType() method's return type is declared as Class<?> there.

The following added to the above example shows that:

System.out.println("getRawType() return type is "
+ type.getClass()
.getMethod("getRawType", (Class<?>[]) null)
.getGenericReturnType());


However, all the observations above, doesn't solve my problem.

I'm writing a generic utility for reflective retrieval of actual type
arguments based on a given class type hierarchy. And I'm not sure if
the above assumption is valid for all possible parameterized types Java
runtime may create?

On the other hand, assuming that there is no other possibility to
represent a raw type in runtime, why getRawType() return type is not
declared as a Class<?> in ParameterizedType interface (as in its
internal implementation)? It would be easier to use declared that way.


piotr
 
D

Daniel Pitts

Daniel said:
how 'bout you try it and let us know what happens.

Well, it passes all my tests. Here is one, if you wanna try it also:

<sscce>
import java.lang.reflect.*;
import java.util.*;

public class RawTypeTest {
static List<String> list = new ArrayList<String>();

public static void main(String[] args) throws Exception {
ParameterizedType type
= (ParameterizedType)RawTypeTest.class
.getDeclaredField("list").getGenericType();
Class rawType = (Class)type.getRawType();
System.out.println("raw type of " + type + " is " + rawType);
}}

</sscce>

In addition to that, I've even checked Sun's implementation of
ParameterizedType
(sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl), and the
getRawType() method's return type is declared as Class<?> there.

The following added to the above example shows that:

System.out.println("getRawType() return type is "
+ type.getClass()
.getMethod("getRawType", (Class<?>[]) null)
.getGenericReturnType());

However, all the observations above, doesn't solve my problem.

I'm writing a generic utility for reflective retrieval of actual type
arguments based on a given class type hierarchy. And I'm not sure if
the above assumption is valid for all possible parameterized types Java
runtime may create?

On the other hand, assuming that there is no other possibility to
represent a raw type in runtime, why getRawType() return type is not
declared as a Class<?> in ParameterizedType interface (as in its
internal implementation)? It would be easier to use declared that way.

piotr

Future extendability perhaps. You might be able to assume its a class
for now, but have to update your code on later Java releases. You'd
be safest doing an instanceof check on the object you get back, and
reporting something other than class (JOptionPane comes to mind.)

Hope this helps.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top