1

我有一个参考队列,声明为:

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()下一个对象(由于队列的原始类型)。我既不能在我需要的对象上调用方法,也不能将它传递给需要 aMapChunk本身的方法。当然,这会阻碍引用队列的许多使用,在这种情况下我可能会做错事。我确定我只会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).

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

4

1 回答 1

3

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

Reference<? extends MapChunk> ref = rqueue.poll();
MapChunk mc = ref.get();
于 2013-08-01T17:09:33.460 回答