如果一段时间后未使用它们,我正在尝试使哈希图中的对象过期。
我有不同类型对象的映射,并希望使用泛型来处理它们以避免代码重复。
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)
有没有办法做到这一点?