【问题标题】:Java create generic class with generic typeJava创建具有泛型类型的泛型类
【发布时间】:2017-04-18 13:34:50
【问题描述】:

我正在尝试使用DualCache 库实现一个通用缓存类。在实例化 DualCache 类时,还需要提供一个序列化程序实例,该实例本身是一个泛型类,应该与它所附加的 DualCache 具有相同的类型。

简单地说,我需要以某种方式将 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 ;
        }
    }
}

【问题讨论】:

  • T 在运行时被擦除。为了做到这一点,您需要在启动Cache&lt;T&gt;DualCache&lt;T&gt; 时将T 的类存储在某处。或者,如果您可以从 CacheDualCache 获取 T 的实例,则可以使用该实例来确定类。
  • 由于类型擦除,您将无法在运行时访问T 的类型,因此您可能必须将Class&lt;T&gt; 传递给initialize() 并将其传递给JsonSerializer。或者将其传递给Cache 构造函数并将其存储在实例中。

标签: java android generics reflection dualcache


【解决方案1】:

假设有一个JsonSerializer&lt;T&gt;(Class&lt;T&gt;) 形式的构造函数,您将需要做完全相同的事情。

private final Class<T> clazz;

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

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

【讨论】:

  • 感谢您的解决方案,并为我迟到的回复道歉。这解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多