我的问题如上。对不起,它可能是重复但我找不到最后一个<?>
的例子。
为什么你不只是使用Class
作为参数?
Class
是一个可参数化的类,因此你可以使用语法Class<T>
,其中T
是一个类型。通过写Class<?>
,你宣布一个可以是任何类型的Class
对象(?
是一个通配符)。 Class
类型是包含有关类的元信息的类型。
通过指定他的特定类型来引用泛型类型总是很好的做法,通过使用Class<?>
你尊重这种做法(你知道Class
是可参数化的),但是你并没有限制你的参数具有特定的类型。
关于泛型和通配符的参考:http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
关于Class
对象和反射的参考(用于内省自身的Java语言的特征):https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
这个<?>
是一头野兽。它经常导致混乱和错误,因为,当你第一次看到它,然后你开始相信,<?>
是任何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<?>
不是一个集合,适用于任何类型的对象。它只能存储一种类型:神秘的“未知类型”。当然,这不是真正的类型。
这意味着您的Class引用可以包含对任何Class对象的引用。
它与“类”基本相同,但是你向其他人展示了你没有忘记泛型的代码,你只需要一个可以容纳任何Class对象的引用。
Bruce Eckel,Thinking in Java:
在Java SE5中,Class <?>比普通类更受欢迎,即使它们是等效的,如您所见,普通类也不会产生编译器警告。 Class <?>的好处是它表明你不仅仅是偶然使用非特定的类引用,也不是出于无知。您选择了非特定版本。
这是一个generics字面意思。这意味着您不知道此Class
实例所代表的类的类型,但您仍在使用通用版本。
Class<Foo>
。这样你就可以创建一个新实例,例如,不需要强制转换:Foo foo = clazz.newInstance();
在泛型中,未知类型由通配符“?”表示。阅读here的官方例子。
这意味着具有任何类型(未知)的类。
您应该阅读java泛型教程以更好地理解它