关于java 泛型设计接口 导致的参数类型不匹配问题

查看:259
本文介绍了关于java 泛型设计接口 导致的参数类型不匹配问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

1.设计了一个接口用于包装其它 pojo,以计算是否过期

public interface CatchWrapper<T>{
    public long getCatchedTime();
    
    public T getValue();
    
    public boolean valid();
}

某一个实现:

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;
    }

}

另有一个管理类,主要是删除过期的缓存

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;
    }

    /**
     * 周期性检查过期的缓存,然后删除
     */
    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);
        
    }

    /**
     * 停在对缓存进行过期检查
     */
    public void stop() {
        stop = true;
        service.shutdownNow();
    }
}

但是真正构造函数 传参数报错

private final ConcurrentMap<String, DeviceCatchWrapper> catchMap = new ConcurrentHashMap<>(); 

下面的报错,参数不对
private final DeviceCatchWrapperManager<Device> catchManager = new DeviceCatchWrapperManager<Device>(catchMap, 2, 2, TimeUnit.HOURS);

改怎么解决这个错误 或者 该怎么设计接口或者改进呢?

解决方案

ConcurrentMap<String, DeviceCatchWrapper> catchMap = new ConcurrentHashMap<>(); 这句有问题
改成ConcurrentMap<String, CatchWrapper<Device>> catchMap = new ConcurrentHashMap<String, DeviceCatchWrapper>();试试

这篇关于关于java 泛型设计接口 导致的参数类型不匹配问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆