獲取在執行時滿足泛型引數的類

很多繫結的泛型引數,就像那些在靜態方法中使用,不能在執行時被回收(參見其他執行緒擦除 )。但是,在執行時,有一種通用策略用於訪問滿足類的泛型引數的型別。這允許依賴於對型別的訪問的通用程式碼,不必通過每次呼叫來執行緒型別資訊。

背景

可以通過建立匿名內部類來檢查類的泛型引數化。該類將捕獲型別資訊。一般來說,這種機制被稱為超型別令牌,在 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();
    }
}