關(guān)于java 泛型設(shè)計(jì)接口 導(dǎo)致的參數(shù)類(lèi)型不匹配問(wèn)題
問(wèn)題描述
1.設(shè)計(jì)了一個(gè)接口用于包裝其它 pojo,以計(jì)算是否過(guò)期
public interface CatchWrapper<T>{ public long getCatchedTime();public T getValue();public boolean valid();}
某一個(gè)實(shí)現(xiàn):
public class DeviceCatchWrapper implements CatchWrapper<Device> { private final long catchedTime; private final Device device; private static final long CATCH_TIME = 20*1000; public DeviceCatchWrapper(Device device) {this.device = device;catchedTime = System.currentTimeMillis(); } @Override public long getCatchedTime() {return catchedTime; } @Override public Device getValue() {return device; } @Override public boolean valid() {return System.currentTimeMillis() - catchedTime < CATCH_TIME; }}
另有一個(gè)管理類(lèi),主要是刪除過(guò)期的緩存
public class DeviceCatchWrapperManager<T> { private static final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<String, CatchWrapper<T>> catchStore; private final long initialDelay; private final long delay; private TimeUnit unit; private volatile boolean stop = false; public DeviceCatchWrapperManager(ConcurrentMap<String,CatchWrapper<T>> catchStore, long initialDelay, long delay, TimeUnit unit) {this.catchStore = catchStore;this.initialDelay = initialDelay;this.delay = delay;this.unit = unit; } /** * 周期性檢查過(guò)期的緩存,然后刪除 */ public void startLoop() {service.scheduleWithFixedDelay(new Runnable() { @Override public void run() {for (Entry<String, CatchWrapper<T>> entry : catchStore.entrySet()) { if (stop)break; String key = entry.getKey(); CatchWrapper<T> cw = entry.getValue(); if (!cw.valid()){System.out.println('Device catch manager --------------->remove:'+key);catchStore.remove(key, cw); }} }}, initialDelay, delay, unit); } /** * 停在對(duì)緩存進(jìn)行過(guò)期檢查 */ public void stop() {stop = true;service.shutdownNow(); }}
但是真正構(gòu)造函數(shù) 傳參數(shù)報(bào)錯(cuò)
private final ConcurrentMap<String, DeviceCatchWrapper> catchMap = new ConcurrentHashMap<>(); 下面的報(bào)錯(cuò),參數(shù)不對(duì)private final DeviceCatchWrapperManager<Device> catchManager = new DeviceCatchWrapperManager<Device>(catchMap, 2, 2, TimeUnit.HOURS);
改怎么解決這個(gè)錯(cuò)誤 或者 該怎么設(shè)計(jì)接口或者改進(jìn)呢?
問(wèn)題解答
回答1:ConcurrentMap<String, DeviceCatchWrapper> catchMap = new ConcurrentHashMap<>(); 這句有問(wèn)題改成ConcurrentMap<String, CatchWrapper<Device>> catchMap = new ConcurrentHashMap<String, DeviceCatchWrapper>();試試
相關(guān)文章:
1. python - 有什么好的可以收集貨幣基金的資源?2. java - 為什么第一個(gè)線程已經(jīng)釋放了鎖,第二個(gè)線程卻不行?3. javascript - 關(guān)于<a>元素與<input>元素的JS事件運(yùn)行問(wèn)題4. css3 - 我想要背景長(zhǎng)度變化,而文字不移動(dòng),要怎么修改呢5. MySQL中的enum類(lèi)型有什么優(yōu)點(diǎn)?6. css3 - 純css實(shí)現(xiàn)點(diǎn)擊特效7. python - 啟動(dòng)Eric6時(shí)報(bào)錯(cuò):’qscintilla_zh_CN’ could not be loaded8. mysql - 記得以前在哪里看過(guò)一個(gè)估算時(shí)間的網(wǎng)站9. android下css3動(dòng)畫(huà)非常卡,GPU也不差啊10. 大家好,我想請(qǐng)問(wèn)一下怎么做搜索欄能夠搜索到自己網(wǎng)站的內(nèi)容。
