2017-04-18 12 views
1

DualCacheライブラリを使用して汎用キャッシュクラスを実装しようとしています。 DualCacheクラスをインスタンス化するときには、シリアライザインスタンス自体を提供する必要があります。シリアライザインスタンスは、それが接続されているDualCacheと同じタイプであるべき汎用クラスです。Javaジェネリック型の汎用クラスを作成します

単純に言えば、コードに示されているようにTのクラスをJSONSerializerコンストラクタに渡す必要がありますが、方法はわかりません。フォームJsonSerializer<T>(Class<T>)のコンストラクタがあると仮定すると、

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 'のいずれかをintisizlingするときに、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

、あなたはまったく同じことを行う必要があります。

private final Class<T> clazz; 

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

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

あなたの解決策と私の遅い応答のお詫び申し上げまして、ありがとうございます。これは問題を解決します。 – DarthPaghius

関連する問題