Class<?>
和 Class<T>
在 Java 中都表示 Class
类型的对象,但它们的使用方式和作用略有不同。让我们详细分析它们的区别:
1. Class<?>
(通配符 Class 类型)
-
?
代表一个未知类型(Wildcard)。 -
Class<?>
表示任何类型的 Class 对象,但不限定具体类型。 -
适用于泛型方法或需要处理不同类型 Class 的情况。
-
不能直接用于创建该类型的实例(因为
?
代表不确定的类型)。 -
public void printClassInfo(Class<?> clazz) { System.out.println("Class name: " + clazz.getName()); } printClassInfo(String.class); // 输出: java.lang.String printClassInfo(Integer.class); // 输出: java.lang.Integer
2.
Class<T>
(泛型 Class 类型) -
T
是一个具体的泛型类型,代表某个确定的类型。 -
Class<T>
主要用于 泛型方法或类,确保类型安全。 -
允许
T
作为类型参数,用于创建实例等操作。 -
public class InstanceCreator { public static <T> T createInstance(Class<T> clazz) throws Exception { return clazz.getDeclaredConstructor().newInstance(); } } String str = InstanceCreator.createInstance(String.class); System.out.println(str); // 输出: 空字符串 ""
✅ 这里
Class<T>
允许我们传递一个Class<String>
,并确保createInstance
方法返回的是String
类型。 -
3.
Class<?>
vsClass<T>
对比对比项 Class<?>
Class<T>
含义 任何类型的 Class
对象确定类型 T
的Class
对象泛型支持 不能确定类型,只能作为参数传递 允许创建 T
类型的实例类型安全 不安全,只能操作 Object
安全,可限定 T
的类型实例化 ❌ 不支持 newInstance()
✅ 支持 newInstance()