如何访问Generics的Class对象?
目前,我这样做:
List<String> list= new ArrayList<String>();
list.getClass();
这样好吗?或者,应该是什么样的方式?
答案 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
,但在适当的情况下也可以是ParameterizedType
或WildcardType
的实例。后两种情况都允许您查看声明的泛型类型。除了instanceof
检查之外,我不知道有任何特别优雅的方法来处理这个问题,但是如果你需要的话,信息就在那里。
这可以提供有关字段的泛型类型,方法参数和返回类型以及类本身的信息(它们自己的通用参数以及它的超类和实现的接口的参数)。如果您需要在反射上下文中对泛型方法进行类型安全的参数检查,这可能非常有用。