Java Generics Wildcards Question

Я столкнулся с некоторыми проблемами с Generics при использовании превосходной Multimap Google Guava. У меня есть обработчик типа, определенный как таковой

public interface Handler<T extends Serializable> {
    void handle(T t);
} 

В другом классе я определил мульти-карту, которая отображает строку в коллекцию обработчиков.

private Multimap<String, Handler<? extends Serializable>> multimap = 
    ArrayListMultimap.create();

Теперь, когда я пытаюсь что-то сделать с мульти-картой, я получаю ошибки компилятора. Моя первая попытка выглядела так:

public <T extends Serializable> void doStuff1(String s, T t)  {
    Collection<Handler<T>> collection = multimap.get(s);
    for (Handler<T> handler : collection) {
        handler.handle(t);
    }
}

, что привело к следующей ошибке.

Несоответствие типов: невозможно преобразовать из Collection > в Collection >

После этого я попытался закодировать это похоже на этот

public void doStuff2(String s, Serializable serializable)  {
    Collection<Handler<? extends Serializable>> collection = multimap.get(s);
    for (Handler<? extends Serializable> handler : collection) {
        handler.handle(serializable); 
    }
}

, который, к сожалению, тоже потерпел неудачу:

Дескриптор метода (захват # 1-of? extends Serializable) в типе Handler неприменим для аргументов (Serializable)

Любая помощь будет принята с благодарностью. Спасибо.

Обновление:

Единственный способ, которым мне удалось это исправить, - это подавить comp iler предупреждения. Учитывая следующий обработчик:

public interface Handler<T extends Event> {
    void handle(T t);

    Class<T> getType();
}

Я могу написать шину событий как таковую.

public class EventBus {

    private Multimap<Class<?>, Handler<?>> multimap = ArrayListMultimap.create();

    public <T extends Event> void subscribe(Handler<T> handler) {
        multimap.put(handler.getType(), handler);
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void publish(Event event)  {
        Collection<Handler<?>> collection = multimap.get(event.getClass());
        for (Handler handler : collection) {
            handler.handle(event);
        }
    }
}

Думаю, с этим нельзя справиться с меньшими затратами или даже без @SuppressWarnings?

14
задан Tom 14 May 2011 в 12:39
поделиться