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

问题如上,抱歉,这可能是一个重复的,但我不能find一个例子与<?>结束。

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

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

通过指定他的具体types来引用一个generics是一个很好的习惯,通过使用Class<?>你尊重这种做法(你知道Class是可参数化的),但是你并没有限制你的参数有一个具体types。

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

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

这个<?>是一只野兽。 它经常会导致混淆和错误,因为当你首先看到它的时候,你开始相信,对于任何Javatypes来说<?>都是通配符。 这是不正确的。 <?>未知的types ,是一个轻微和讨厌的区别。

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<?>不是一个集合,它适用于任何types的对象。 它只能存储一种types:神秘的“未知types”。 当然,这不是一个真正的types。

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

  • 如果你知道这个类,你可以使用Class<Foo> 。 这样,你可以创build一个新的实例,例如,不用转换: Foo foo = clazz.newInstance();
  • 如果你根本不使用generics,至less会得到一个警告(而不使用generics通常是不鼓励的,因为它可能导致难以检测的副作用)

在generics中,未知types由通配符“?”表示。 在这里阅读官方的例子。

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

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

Bruce Eckel,用Java思考:

在Java SE5中,Class <?>优先于普通的Class,即使它们是等价的,正如您看到的,Class不会产生编译器警告。 Class <?>的好处是它表明你不是偶然使用非特定的类的引用,或者是因为无知。 您select了非特定版本。

这意味着一个任何types的类(未知)。

你应该阅读javagenerics教程来更好地理解它