2012-03-29 32 views
83

上面的问题,对不起,它可能是一个重复,但我找不到<?>结尾的例子。Class <?>在Java中有什么含义?

为什么你不直接使用Class作为参数?

+0

http://en.wikipedia.org/wiki/Wildcard_%28Java%29 – Anycorn 2012-03-29 08:27:24

+0

http://stackoverflow.com/q/2024513/1140748 – 2012-03-29 08:31:22

回答

67

Class是一个可参数化的类,因此您可以使用语法Class<T>其中T是一个类型。通过编写Class<?>,您宣布可以为任何类型的Class对象(?是通配符)。 Class类型是一种包含有关类的元信息的类型。

通过使用Class<?>来指定他的特定类型来引用泛型,这是很好的习惯(你知道Class是可参数化的),但是你不限制你的参数一个特定的类型。

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

参考关于类对象和反射(Java语言用来内省本身的功能):http://java.sun.com/developer/technicalArticles/ALT/Reflection/

+3

这样做只是简单地使用没有类型的'Class'有什么好处?他们似乎代表了同样的事情。 – ashes999 2013-06-22 14:47:59

+0

我认为一个通用的整个观点是你不知道类的前面。否则,您只需定义一个函数来为参数使用特定的类类型。这个问号仍然没有意义。 – Brain2000 2015-03-06 17:48:55

+2

除了告诉编译器“我知道这是一个泛型类,但我不知道或关心实际类型,所以没有其他好处,所以不是给出一个具体的类型,而是给出'? “通配符”。如果你没有给出通配符,编译器就会假设你忘记了类型,或者不知道这个类是通用的,并且会警告你。 – Kayaman 2016-02-29 07:51:10

5

这是一个generics文字。这意味着你不知道这个Class实例代表的类的类型,但是你仍然在使用通用版本。

  • 如果你知道这个班级,你会使用Class<Foo>。这样,你可以创建一个新的实例,例如,无铸造:Foo foo = clazz.newInstance();
  • ,如果你不使用泛型可言,你会得到至少(而不是使用泛型一般不提倡,因为它可能导致一个警告难以察觉的副作用)
2

这意味着一类与任何类型的东西(未知)。

你应该阅读Java泛型教程去更好地理解它

5

这意味着你的类的引用可以容纳任何类对象的引用。

它基本上是一样的“类”,但你展示其他人谁看了你的代码,你没有忘记泛型,你只是想,可以容纳任何类对象的引用。

Bruce Eckel着在Java编程思想:

在Java SE5,类<>优于普通班,即使他们 是等价的,普通类,就像你看到的,不会产生?一个 编译器警告。 <类的好处?>是它 表明你不只是使用,或出于无知由 事故非特异性类引用。您选择了非特定版本。

+1

报价说“类优于普通类”和“The类别的好处“。看起来,blockquote与尖括号不一致。 – MasterF 2012-03-29 17:13:28

+0

它需要被转义。现在就修正它:P – 2016-02-29 07:08:52

3

在泛型,一个未知的类型由通配符表示“?”。官方示例,请阅读here

42

<?>是一个野兽。它通常会导致混淆和错误,因为当你首先看到它时,那么你开始相信,<?>的任何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<?>是不是一个集合,适合于只是任何类型的对象。它只能存储一种类型:神秘的“未知类型”。当然,这不是真正的类型。

相关问题