java中的Class clazz和Class <?> clazz有什么区别?

And*_*sta 10 java reflection ternary-operator

我需要在java中使用反射.据我所知,它Class clazz创建了一个表示Class对象的变量.但是,我试图ClassString使用该forName("aClassName")方法引用一个对象.我的IDE(Eclipse)似乎更喜欢Class<?> clazz用于声明变量的符号.我在其他地方多次看过这种表示法.这是什么意思?

编辑:删除了对三元运算符的引用,因为它与此问题无关.

Jon*_*eet 25

Class是一种原始类型 - 它基本上是一种通用类型,您可以将其视为根本不了解泛型.

Class<?>是使用未绑定通配符的泛型类型- 它基本上意味着" Class<Foo>对于某种类型Foo,但我不知道是什么".

类似地,您可以使用带有边界的通配符:

  • Class<? extends InputStream>意思是" Class<Foo>对于某种类型Foo,但我不知道它是什么,只要它InputStream或子类"

  • Class<? super InputStream>意思是" Class<Foo>对于某种类型Foo,但我不知道它是什么,只要它InputStream或超类"

又见Java泛型常见问题解答很多的详细信息:

和Java语言规范:

特别是,从原始类型部分:

原始类型与通配符密切相关.两者都基于存在类型.原始类型可以被认为是通配符,其类型规则是故意不合理的,以适应与遗留代码的交互.从历史上看,原始类型先于通配符; 它们最初是在GJ中引入的,并在文章中描述了过去的未来安全:Gilad Bracha,Martin Odersky,David Stoutamire和Philip Wadler在Java编程语言中添加了通用性,参见ACM会议论文集 - 面向编程,系统,语言和应用(OOPSLA 98),1998年10月.