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 ;
}
}
}
実行時に 'T'が消去されます。これを行うには、 'Cache'または 'DualCache 'のいずれかをintisizlingするときに、Tのクラスをどこかに格納する必要があります。あるいは、 'Cache'や' DualCache'からTのインスタンスを得ることができれば、そのインスタンスを使ってクラスを決定することができます。 –
型消去のため、実行時に 'T'の型にアクセスすることはできませんので' Class 'を' initialize() 'に渡して' JsonSerializer'に渡す必要があります。あるいは、それを 'Cache'コンストラクタに渡し、それをインスタンスに格納します。 –
Thomas
http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime – Andremoniy