2017-04-18 249 views
1

我試圖使用DualCache庫實現泛型高速緩存類。當實例化DualCache類時,還需要提供一個序列化器實例,該實例本身是一個通用類,應與其所連接的DualCache類型相同。Java創建具有泛型類型的泛型類

簡而言之,我需要以某種方式將T的類傳遞給代碼中指示的JSONSerializer構造函數,但不知道如何。

public class Cache<T> { 
    private boolean initialized = false ; 
    private ArrayList<Long> cachedItemList = new ArrayList<>() ; 
    private DualCache<T> dualCache ; 

    public void initialize(Context context) { 
     Log.e(DEBUG_TAG, "Cache/initialize") ; 
     if (!initialized) { 
      dualCache = new Builder<T>(ProjectInfo.cacheName, ProjectInfo.APP_VERSION) 
        .enableLog() 
        .useReferenceInRam(ProjectInfo.diskCacheSize, new SizeOf<T>() { 
         @Override 
         public int sizeOf(T object) { 
          return ProjectInfo.diskCacheSize/numCachedItems; 
         } 
        }) 
        .useSerializerInDisk(ProjectInfo.diskCacheSize, true, 
          new JsonSerializer<>(T.class), context) 
        .build() ; 
      getCurrentCachedItemsList(context) ; 
      printCurrentItems(context) ; 
      initialized = true ; 
     } 
    } 
} 
+1

'T'在運行時被擦除。爲了做到這一點,你需要在接收'Cache '或'DualCache '時將T的類存儲在某個地方。或者,如果您可以從'Cache'或'DualCache'獲得T的實例,則可以使用該實例來確定類。 –

+3

由於類型擦除,您將無法在運行時訪問「T」類型,因此您可能必須將'Class '傳遞給'initialize()'並將其傳遞給'JsonSerializer'。或者將它傳遞給'Cache'構造函數並將其存儲在實例中。 – Thomas

+0

http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime – Andremoniy

回答

2

假設有形式JsonSerializer<T>(Class<T>)的構造函數,你需要做同樣的事情。

private final Class<T> clazz; 

public Cache(Class<T> clazz) { 
    this.clazz = clazz; 
} 

public void initialize(Context context) { 
    ... 
         new JsonSerializer<>(clazz), context) 
+0

感謝您的解決方案,併爲我遲到的迴應道歉。這解決了這個問題。 – DarthPaghius