2017-04-18 159 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