我的问题如上。对不起,这可能是一个副本,但我无法找到一个例子与 <?>的结束。
<?>
为什么不直接使用 Class作为参数呢?
Class
字面意思是 非专利药。这意味着您不知道这个 Class实例所表示的类的类型,但是您仍然在使用泛型版本。
Class<Foo>
Foo foo = clazz.newInstance();
这意味着具有任意类型(未知)的类。
你应该阅读 java 泛型教程来更好地理解它
这意味着 Class 引用可以包含对任何 Class 对象的引用。
它基本上与“ Class”相同,但是你向其他读过你代码的人展示了你并没有忘记泛型,你只是想要一个可以容纳任何 Class 对象的引用。
布鲁斯 · 埃克尔(Bruce Eckel) ,《用 Java 思考:
在 JavaSE5中,Class < ? > 优先于纯类,尽管它们 是等价的,而普通的 Class,如您所见,不会产生一个 编译器警告。类的好处就是这样 指示您不仅仅使用非特定的类引用 意外,或出于无知。你选择了非特定的版本。
Class是一个可参数化的类,因此可以使用语法 Class<T>,其中 T是一个类型。通过编写 Class<?>,可以声明一个 Class对象,该对象可以是任何类型(?是通配符)。Class类型是包含有关类的元信息的类型。
Class<T>
T
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<?>不是一个集合,它适合于任何类型的对象。它只能存储一种类型: 神秘的“未知类型”。肯定不是那种类型的。
List<?>
这意味着 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”实例。