オブジェクトがしばらく使用されていない場合、ハッシュマップからオブジェクトを期限切れにしようとしています。
さまざまなタイプのオブジェクトのマップがあり、コードの重複を避けるためにジェネリックを使用してそれらを処理したいと考えています。
private Map<String,EvictableObject<ObjectA>> _objectsA = new HashMap<String,EvictableObject<ObjectA>> ();
private Map<String,EvictableObject<ObjectB>> _objectsB = new HashMap<String,EvictableObject<ObjectB>> ();
private Map<String,EvictableObject<ObjectC>> _objectsC = new HashMap<String,EvictableObject<ObjectC>> ();
private Map<String,EvictableObject<ObjectD>> _objectsD = new HashMap<String,EvictableObject<ObjectD>> ();
private void startEvictionTask() {
Runnable evictionTask = new Runnable() {
public void run () {
runEviction(_objectsA);
runEviction(_objectsB);
runEviction(_objectsC);
runEviction(_objectsD);
}
private void runEviction (Map<String, EvictableObject<?>> table) {
final long expirationPeriod = 60 * 60 * 1000; // 60 minutes (in ms)
synchronized (table) {
for (Map.Entry<String,EvictableObject<? extends Object>> entry : table.entrySet()) {
if (entry.getValue().getAccessedSince() > expirationPeriod)
table.remove(entry.getKey());
}
}
}
};
MyThreadPool.getScheduledExecutor().scheduleWithFixedDelay(evictionTask, 65*60, 5*60, TimeUnit.SECONDS);
}
しかし、私が試したことはどれも runEviction メソッドの宣言として機能していないようです。そして、コンパイラーは、実際の引数を宣言されたメソッドパラメーターに変換できないと言い続けます。
私はもう試した:
private void runEviction (Map<String, EvictableObject<?>> table)
、
private void runEviction (Map<String, EvictableObject<B>> table)
、
private void runEviction (Map<String, EvictableObject<B extends Object>> table)
と
private void runEviction (Map<String, EvictableObject<? extends Object>> table)
これを行う方法はありませんか?