我的问题如上。对不起,这可能是重复的,但我找不到最后一个<?>
的例子。
为什么不只使用Class
作为参数?
答案 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”实例。