关于语法:Class <?>在Java中意味着什么?

What does Class mean in Java?


我的问题如上。 对不起,它可能是重复但我找不到最后的示例。


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



Class是一个可参数化的类,因此您可以使用语法Class,其中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/



这个是一头野兽。它经常会导致混乱和错误,因为当你第一次看到它时,你开始相信,是任何java类型的通配符。这是......不是真的。 是未知类型,轻微和讨厌的区别。


Class一起使用时,这不是问题。这两行都可以工作和编译:

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


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

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


我们的List不是一个集合,适用于任何类型的对象。它只能存储一种类型:神秘的"未知类型"。当然,这不是真正的类型。



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


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


Bruce Eckel,Thinking in Java:

In Java SE5, Class is preferred over plain Class, even though they
are equivalent and the plain Class, as you saw, doesn’t produce a
compiler warning. The benefit of Class is that it
indicates that you aren’t just using a non-specific class reference by
accident, or out of ignorance. You chose the non-specific version.



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

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


在泛型中,未知类型由通配符"?"表示。在这里阅读官方示例。



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


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