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

我的问题如上。对不起,这可能是一个副本,但我无法找到一个例子与 <?>的结束。

为什么不直接使用 Class作为参数呢?

169110 次浏览

字面意思是 非专利药。这意味着您不知道这个 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<?>,您尊重了这种做法(您知道 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 对象。如果 JVM 加载一个类型,那么表示该类型的类对象将出现在 JVM 中。我们可以从反射包中经常使用的类对象中获得关于类型的元数据。

假设您有一个名为“ myPackage.MyClass”的类。

Class<?> myClassObject = MyClass.class; //compile time check


Class<?> myClassObject = Class.forname("myPackage.MyClass"); //only runtime check

如果 Class < ? > 引用也位于方法参数中,那么这种方式也是类似的。

请注意,类“ Class”没有公共构造函数。因此,不能使用“ new”运算符实例化“ Class”实例。