如果类型擦除允许我只调用Object()方法,如何调用ReferenceQueue中项目的方法?

时间:2013-08-01 17:06:35

标签: java type-erasure soft-references

我有一个引用队列,声明为:

ReferenceQueue<MapChunk> rqueue = new ReferenceQueue<>();

我有一些以

形式构建的软引用
SoftReference ref=new SoftReference<MapChunk>(ourChunk, rqueue);

根据文档,rqueueReferenceQueue<? extends MapChunk>

我希望在垃圾收集上调用一个处理程序,这就是我将它们放入队列的原因。但是,当我从另一个线程开始处理队列时,我通过

从队列中检索对象
Reference ref=rqueue.poll();
synchronized (chunks) {
    synchronized (MapDatabase.class) {
        chunks.put(ref.get().getPosition(), ref.get());
    }
}

我的编译器错误表明发生了类型擦除,我留下ref.get()作为对象(由于队列的原始类型)。我既不能在我需要的对象上调用方法,也不能将它传递给需要MapChunk本身的方法。当然这会阻碍参考队列的许多用途,在这种情况下我可能做错了。我确信我只会在运行时获得MapChunk个对象,所以我应该使用强制转换吗?做点别的吗?根本不使用参考队列?

编辑:如果我使用Reference<MapChunk> ref=rqueue.poll(),我会收到以下信息:

cannot convert from Reference<capture#1-of ? extends MapChunk> to Reference<MapChunk>

当我使用Reference<? extends MapChunk> ref=rqueue.poll();时,该行上的错误已解决,但当我尝试使用ref时会出现另一个错误:

The method addMapChunk(Position, SoftReference<MapChunk>) in the type HashMap<Position,SoftReference<MapChunk>> is not applicable for the arguments (Position, capture#3-of ? extends MapChunk).

编辑:我想这只是一个错误的错误消息,因为当另一个错误被修复时类型确实正确转换。

1 个答案:

答案 0 :(得分:3)

如果您不想删除类型,请不要删除该类型。

Reference<? extends MapChunk> ref = rqueue.poll();
MapChunk mc = ref.get();