Я сталкиваюсь с некоторыми проблемами с Generics при использовании Google Guava превосходного Multimap. У меня есть обработчик типа, определенный как
public interface Handler<T extends Serializable> {
void handle(T t);
}
В другом классе я определил multimap, который отображает String в коллекцию обработчиков.
private Multimap<String, Handler<? extends Serializable>> multimap =
ArrayListMultimap.create();
Теперь, когда я пытаюсь сделать материал с помощью multimap, я получаю ошибки компилятора. Моя первая попытка выглядела так:
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);
}
}
что привело к следующей ошибке.
Type mismatch: cannot convert from Collection<Handler<? extends Serializable>>
to Collection<Handler<T>>
Впоследствии я попытался закодировать его следующим образом
public void doStuff2(String s, Serializable serializable) {
Collection<Handler<? extends Serializable>> collection = multimap.get(s);
for (Handler<? extends Serializable> handler : collection) {
handler.handle(serializable);
}
}
к сожалению, тоже не удалось:
The method handle(capture#1-of ? extends Serializable) in the type
Handler<capture#1-of ? extends Serializable> is not applicable for the arguments
(Serializable)
Любая помощь будет принята с благодарностью. Спасибо.
Update:
Единственным способом, которым я смог это исправить, является подавление предупреждений компилятора. Учитывая следующий обработчик:
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?