我有一个引用队列,声明为:
ReferenceQueue<MapChunk> rqueue = new ReferenceQueue<>();
我有一些以
形式构建的软引用SoftReference ref=new SoftReference<MapChunk>(ourChunk, rqueue);
根据文档,rqueue
为ReferenceQueue<? 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).
编辑:我想这只是一个错误的错误消息,因为当另一个错误被修复时类型确实正确转换。
答案 0 :(得分:3)
如果您不想删除类型,请不要删除该类型。
Reference<? extends MapChunk> ref = rqueue.poll();
MapChunk mc = ref.get();