Java 泛型将 Class 对象用作类型字面量

更新于 2025-12-28

Jakob Jenkov 2014-06-23

Class 对象也可以在运行时用作类型说明。例如,你可以创建一个泛型方法,如下所示:

public static <T> T getInstance(Class<T> theClass) 
    throws IllegalAccessException, InstantiationException {
    return theClass.newInstance();
}

以下是调用 getInstance() 方法的几个示例:

String string = getInstance(String.class);
MyClass myClass = getInstance(MyClass.class);

可以看到,返回类型会根据传入方法的 Class 对象参数而变化。这在数据库 API(例如 Butterfly Persistence)中非常有用,比如当你从数据库中读取对象时。

下面是一个 read() 方法的定义示例:

public static <T> T read(Class<T> theClass, String sql) 
    throws IllegalAccessException, InstantiationException {
    // 执行 SQL 查询
    T o = theClass.newInstance();
    // 通过反射设置属性
    return o;
}

你可以这样调用 read() 方法:

Driver employee = read(Driver.class, "select * from drivers where id=1");
Vehicle vehicle = read(Vehicle.class, "select * from vehicles where id=1");

是不是很巧妙?