Class <! - ? - >在Java中意味着什么?

时间:2012-03-29 08:25:41

标签: java syntax

我的问题如上。对不起,这可能是重复的,但我找不到最后一个<?>的例子。

为什么不只使用Class作为参数?

7 个答案:

答案 0 :(得分:89)

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

通过使用Class<?>您尊重这种做法(您知道Class可参数化)来引用通用类型总是很好的做法,但是你'不要将参数限制为具有特定类型。

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

关于Class对象和反射的引用(用于内省自身的Java语言的特性):http://java.sun.com/developer/technicalArticles/ALT/Reflection/

答案 1 :(得分:58)

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

答案 2 :(得分:6)

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

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

Bruce Eckel,Thinking in Java:

  

在Java SE5中,Class&lt;?&gt;优于普通班级,即使他们   是等价的,正如你所看到的那样,普通类不产生   编译警告。 Class&lt;?&gt;的好处就是这样   表示您不仅仅使用非特定的类引用   意外,或出于无知。您选择了非特定版本。

答案 3 :(得分:5)

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

  • 如果您认识该课程,则使用Class<Foo>。这样您就可以创建一个新实例,例如,不需要强制转换:Foo foo = clazz.newInstance();
  • 如果您根本不使用仿制药,至少会收到警告(并且通常不鼓励使用仿制药,因为它可能导致难以察觉的副作用)

答案 4 :(得分:4)

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

答案 5 :(得分:3)

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

你应该阅读java generics教程以更好地理解它

答案 6 :(得分:0)

这意味着,Class 引用类型可以容纳代表任何类型的任何 Class 对象。如果 JVM 加载一个类型,则表示该类型的类对象将出现在 JVM 中。我们可以从反射包中大量使用的类对象中获取有关类型的元数据。

假设您有一个名为“myPackage.MyClass”的类。假设在类路径中,下面的语句是等价的。

Class<?> myClassObject = MyClass.class; //compile time check

Class<?> myClassObject = Class.forname("myPackage.MyClass"); //only runtime check

如果 Class 引用也在方法参数中,这将以类似的方式工作。

请注意“Class”类没有公共构造函数。所以你不能用“new”运算符实例化“Class”实例。