获取带泛型的java.lang.Class

时间:2011-10-19 15:21:15

标签: java generics reflection

我是一名学习Java的C#人员,我正在努力了解泛型如何在Java中工作。

给定一个类或接口“SomeThing”,我知道我可以这样做以获得该类型的类:

Something.class

现在,给定一个通用接口

我喜欢写

(GenericInterface<SomeClass>).class 

但编译器不喜欢那么多。

感谢您的帮助。

3 个答案:

答案 0 :(得分:9)

这是因为,由于擦除,不是一个GenericInterface<SomeClass>类。只有一个GenericInterface类,它有一个通用参数。

如果您需要它,以便您可以调用一般类型安全的方法,例如Class.cast()Class.newInstance(),那么您就不走运了。泛型本质上是一个编译时的概念;运行时没有足够的信息来执行通用检查,因此这些方法不能对任意Class实例都是类型安全的。

在这种情况下,您可以做的最好的事情是使用“原始”GenericInterface.class,然后立即将结果显式转换为GenericInterface<SomeClass>。这将正确地给出“未经检查”的警告,因为如上所述,没有运行时检查对象确实具有正确的通用参数,并且JVM只需要接受你的话。

(同样,如果您尝试执行某种instanceof检查,那么这根本不可能。对象没有通用参数它的类;只有你赋予它的变量。再次,由于语言的设计限制,这些运行时检查是不可能的。)

答案 1 :(得分:2)

泛型在Java和C#中根本不同,因为Java泛型在编译时检查,但后来在称为类型擦除的过程中更改为具体类。使用您的示例,GenericInterface<SomeClass>在运行时变为GenericInterface

这是泛型的一个稍微一半的实现,并且正如你所看到它确实存在一些问题(你通常可以解决)。这样做是为了保持与旧版Java的向后兼容性。

答案 2 :(得分:0)

不,Java Generics不会那样工作。

您可以GenericInterface.class来获取非泛型根类,但通用版本没有单独的类。