これの詳細を消さなければなりませんが、基本的にはオブジェクトのコレクションを返す高価な操作の結果をキャッシュしようとしていますが、これらの個々のオブジェクトの型はコンパイル時には分かりませんベースクラス)。検索時のチェックされていないキャストを避けるために、ジェネリック型をキャッシュに保存するにはどうすればよいですか?
public class SomeClass
{
private static final Map<Integer,Collection<? extends SomeBaseClass>> theCache = new HashMap<Integer,Collection<? extends SomeBaseClass>>();
public <T extends SomeBaseClass> Collection<T> theMethod(Class<T> theClass, int index)
{
if (theCache.containsKey(index))
{
return (Collection<T>) theCache.get(index);
}
else
{
Collection<T> result = someExpensiveOperation(theClass, index);
theCache.put(index, result);
return result;
}
}
// ...
}
コードだけで、呼び出し側でメソッドに渡されたクラスの引数は、以前の呼び出しによって渡さ1と(同一である必要があります)互換性があることを信頼にそれを取っているので、ここではキャッシュ検索が未チェックのキャストであります最初にキャッシュにオブジェクトを作成しました。
このチェックされていないキャストは避けることができるように、オブジェクト自体と一緒に実際のクラスをキャッシュするいくつかの方法やデザインパターンがありますか?
これは静的キャッシュでは役に立ちません。 – BalusC