2015-02-24 61 views

回答

2

使用.class文字与类名或调用对象getClass()方法返回Class实例,对任何一类有关联一个且只有一个Class实例它。

对于泛型类型同样适用。类List<T>只有一个类实例,即List.class。不同的类型参数不会有不同的类类型。这类似于C++如何实现泛型,其中每个泛型类型实例化将具有单独的Class实例。所以在Java中,你不能做Set<Integer>.class。 Java不允许这样做,因为它没有意义,并且可能会给出关于Class实例数目的错误意图。

但是,如果你想有一个Class<Set<Integer>>,就可以实现,这将bit型铸造的(这将是安全的),如下图所示:

Class<Set<Integer>> clazz = (Class<Set<Integer>>)(Class<?>) Set.class; 

这将完全正常工作。

+0

非常感谢。我理解“类型擦除”和反射,但我不知道如何去除恼人的类型安全警告(例如,当动态调用方法返回参数化类型时)。现在我明白了:-) – 2015-02-28 13:09:20

2

你不能做这种方式,因为类型参数信息都丢失了在运行和.class声明实际上是评估即可。

你只能做:

Set<Integer> someSet = .. 
Class<?> c2 = someSet.class;