获取带有泛型的java.lang.类



我是一个c#的家伙,正在学习Java,我想了解Java中的泛型是如何工作的。

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

Something.class

现在,给定一个通用接口

我想写

(GenericInterface<SomeClass>).class 

但是编译器不喜欢这样

谢谢你的帮助

这是因为,由于擦除,不存在 GenericInterface<SomeClass>类。只有一个GenericInterface类,它有一个泛型参数。

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

在这种情况下,您能做的最好的事情是使用"原始"GenericInterface.class,然后立即显式地将结果转换为GenericInterface<SomeClass>。这将正确地给出一个"unchecked"警告,因为如上所述,没有运行时检查对象是否确实具有正确的泛型参数,JVM只能相信您的话。

(同样,如果您试图执行某种instanceof检查,那么这也根本不可能。对象没有其类的泛型形参;只有你赋值给它的变量。因此,由于语言的设计限制,这些运行时检查是不可能的。

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

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

不,Java泛型不是这样工作的。

您可以执行GenericInterface.class来获取非泛型根类,但是对于泛型版本没有单独的类。

相关内容

  • 没有找到相关文章

最新更新