是否有任何机会向类引用分配参数化类型,例如:如何获得对参数化类型的类引用
Class<Set> c1= Set.class; //OK
Class<Set<Integer>> c2 = Set<Integer>.class; //Makes error
是否有任何机会向类引用分配参数化类型,例如:如何获得对参数化类型的类引用
Class<Set> c1= Set.class; //OK
Class<Set<Integer>> c2 = Set<Integer>.class; //Makes error
使用.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;
这将完全正常工作。
你不能做这种方式,因为类型参数信息都丢失了在运行和.class
声明实际上是评估即可。
你只能做:
Set<Integer> someSet = ..
Class<?> c2 = someSet.class;
非常感谢。我理解“类型擦除”和反射,但我不知道如何去除恼人的类型安全警告(例如,当动态调用方法返回参数化类型时)。现在我明白了:-) – 2015-02-28 13:09:20