Как я могу вызывать методы для элементов в ReferenceQueue, если стирание типов позволило мне вызывать только методы Object()?
У меня есть справочная очередь, объявленная как:
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).
Редактировать: я думаю, это было просто сообщение об ошибке с ошибкой, так как тип действительно конвертировался, когда была исправлена другая ошибка.
1 ответ
Если вы не хотите стирать тип, не стирайте его.
Reference<? extends MapChunk> ref = rqueue.poll();
MapChunk mc = ref.get();