Как я могу вызывать методы для элементов в 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();
Другие вопросы по тегам