我有代碼具有(消息)處理程序的Map
。我試圖讓處理程序基因組化(如接口處理程序所見)。沒有泛型,處理程序都需要從Object轉換到相應的類,這很好避免(但一切正常)。對於每個消息類(下面的Foo
),我有一個處理程序類。Java泛型:捕獲不能應用於對象
我該如何將任何類別的地圖保存到任何類型的處理程序中,並用「just」Object
來獲取/調用? (不能限制參數handleMessage(Object)
)
請參閱下面的MWE。
import java.util.*;
public class Logic
{
Map<Class<?>, Handler<?>> handlers = new HashMap<Class<?>, Handler<?>>();
public void run()
{
handlers.put(Foo.class, new FooHandler());
}
public void handleMessage(Object msg)
{
Handler<?> handler = handlers.get(msg.getClass());
if (handler != null) {
handler.execute(msg);
}
}
private interface Handler<T>
{
public void execute(T msg);
}
private class FooHandler implements Handler<Foo>
{
public void execute(Foo msg) {}
}
private class Foo {}
}
此代碼生成:
Logic.java:16:執行在Logic.Handler(捕獲#的X')不能應用於>到(java.lang.Object中) 處理程序。執行(MSG);
如何在維持Handler接口一般性的同時修復此問題?
你的答案讓我能夠輸入安全的異構容器,關係泛型類型和whatnot!我有點失望,沒有包裝方法和@SuppressWarnings是不可能的:<。儘管如此,它現在可行,但我不知道是否值得在這裏引入泛型的麻煩。 –
問題是你想要通用語法是多麼複雜。 ;)它將檢查對addHandler,hetHandler和getHandlerFor的調用是否正確。 –