获取在运行时满足泛型参数的类

很多绑定的泛型参数,就像那些在静态方法中使用,不能在运行时被回收(参见其他线程擦除 )。但是,在运行时,有一种通用策略用于访问满足类的泛型参数的类型。这允许依赖于对类型的访问的通用代码,不必通过每次调用来线程类型信息。

背景

可以通过创建匿名内部类来检查类的泛型参数化。该类将捕获类型信息。一般来说,这种机制被称为超类型令牌,在 Neal Gafter 的博文中有详细介绍。

实现

Java 中的三种常见实现是:

用法示例

public class DataService<MODEL_TYPE> {
     private final DataDao dataDao = new DataDao();
     private final Class<MODEL_TYPE> type = (Class<MODEL_TYPE>) new TypeToken<MODEL_TYPE>
                                                                (getClass()){}.getRawType();
     public List<MODEL_TYPE> getAll() {
         return dataDao.getAllOfType(type);
    }
}

// the subclass definitively binds the parameterization to User
// for all instances of this class, so that information can be 
// recovered at runtime
public class UserService extends DataService<User> {}

public class Main {
    public static void main(String[] args) {
          UserService service = new UserService();
          List<User> users = service.getAll();
    }
}