Java中的Class <?>是什么意思?


Answers:


109

Class是可参数化的类,因此可以使用Class<T>where T类型的语法。通过编写Class<?>,您可以声明一个Class可以是任何类型的对象(?是通配符)。该Class类型是包含类元信息的类型。

通过指定特定类型来引用泛型类型始终是一种好习惯,这是通过Class<?>尊重您的习惯(您知道Class可参数化的)来使用的,但是您并没有将参数限制为具有特定类型。

有关泛型和通配符的参考:http : //docs.oracle.com/javase/tutorial/java/generics/wildcards.html

关于Class对象和反射的参考(用于自省的Java语言功能):https : //www.oracle.com/technetwork/articles/java/javareflection-1536171.html


7
与仅使用Class无类型的代码相比,这样做有什么好处?它们似乎代表同一件事。
ashes999 2013年

1
我认为泛型的全部要点是您不预先知道类类型。否则,您将只定义一个函数以对参数使用特定的类类型。这个问号仍然没有意义。
Brain2000

5
除了告诉编译器“我知道这是一个泛型类,但我不知道也不关心实际的类型,所以没有给出具体的类型而是给出?通配符” ,这没有其他好处。 。如果您不提供通配符,则编译器会假定您忘记了该类型或不知道该类是通用类,并会警告您。
卡亚曼

1
什么是Kotlin等效Class<?>
JGuo

根本Class无法传递给类型为的参数 Class<?>,因此Class<?>对于所有情况都更加方便。
petertc

72

<?>是野兽。它通常会导致混乱和错误,因为当您第一次看到它时,便开始相信它<?>任何java类型的通配符。这是不正确的。<?>未知类型,略有不同。

与结合使用时,这不是问题Class。这两行都可以工作并编译:

Class anyType = String.class;
Class <?> theUnknownType = String.class;

但是 -如果我们开始将其与集合一起使用,则会看到奇怪的编译时错误:

List<?> list = new ArrayList<Object>();  // ArrayList<?> is not allowed
list.add("a String");                    // doesn't compile ...

我们List<?>不是一个集合,它仅适用于任何类型的对象。它只能存储一种类型:神秘的“未知类型”。肯定不是真正的类型。


8

这意味着您的Class引用可以保存对任何Class对象的引用。

它基本上与“类”相同,但是您向其他人展示了您不会忘记泛型的代码,您只想要一个可以容纳任何Class对象的引用。

Bruce Eckel,《 Java思维》:

在Java SE5中,Class <?>比普通类更可取,即使它们等效,并且如您所见,普通类也不会产生编译器警告。Class <?>的好处是它表明您不只是偶然或出于无知而使用非特定的类引用。您选择了非特定版本。


1
引号说“ Class <?>比普通Class更可取”和“ Class <?>的优点”。似乎blockquote与尖括号不同。
Filip 2012年

1
它需要逃脱。立即修复:P
Sami Kuhmonen

5

这是一个泛型字面量。这意味着您不知道该Class实例代表的类的类型,但是您仍在使用通用版本。

  • 如果您知道该课程,则可以使用Class<Foo>。这样,您可以创建新实例,例如,无需强制转换:Foo foo = clazz.newInstance();
  • 如果您根本不使用仿制药,那么至少会收到警告(并且不鼓励使用仿制药,因为它可能导致难以发现的副作用)

5

在泛型中,通配符“?”表示未知类型。阅读此处获取官方示例。


3

这意味着具有任何类型(未知)的类。

您应该阅读Java泛型教程以更好地理解它

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.