Java中Class <?>是什么意思?
问题如上,抱歉,这可能是一个重复的,但我不能find一个例子与<?>
结束。
为什么你不只是使用Class
作为参数?
Class
是可参数化的类,因此可以使用语法Class<T>
,其中T是一个types。 通过编写Class<?>
,您可以声明一个可以是任何types的Class
对象( ?
是通配符)。 Class
types是包含有关类的元信息的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教程来更好地理解它