如何访问泛型的Class对象?

时间:2009-01-19 14:38:36

标签: java generics

如何访问Generics的Class对象?

目前,我这样做:

List<String> list= new ArrayList<String>();
list.getClass();

这样好吗?或者,应该是什么样的方式?

2 个答案:

答案 0 :(得分:7)

这将返回与ArrayList.class相同的内容。 Java泛型在运行时擦除泛型类型;换句话说,从“list”你永远不会知道元素类型是String。

上有一个很棒的常见问题解答

http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

答案 1 :(得分:3)

确实,擦除使得无法获得给定对象的泛型类型信息,因为泛型仅保存在源代码的结构中。但是,这并不意味着不可能获得泛型类型参数,并且在许多重要情况下(例如,构建给定类/方法的接口),您可以执行此操作。如果通过反射获得类的元素,则可以获得有关所使用的声明类型的通用信息。

例如,通过反射获取java.lang.reflect.Method并调用例如getGenericReturnType()就可以了。这将返回java.lang.reflect.Type的实例,该实例可以只是Class,但在适当的情况下也可以是ParameterizedTypeWildcardType的实例。后两种情况都允许您查看声明的泛型类型。除了instanceof检查之外,我不知道有任何特别优雅的方法来处理这个问题,但是如果你需要的话,信息就在那里。

这可以提供有关字段的泛型类型,方法参数和返回类型以及类本身的信息(它们自己的通用参数以及它的超类和实现的接口的参数)。如果您需要在反射上下文中对泛型方法进行类型安全的参数检查,这可能非常有用。