我很親密,但我沒有把頭纏到它的周圍。一個通用的EventManager - 在3行代碼之後卡住:-)
我試圖用Java創建(安卓)用默認的東西,事件管理器,例如註冊事件,引發事件,等等...
我想這是一個「通用」的方式,我可以寫這樣的事:
StringChangedEvent event
= evManInst.Register<StringChangedEvent>(new StringChangedEvent());
event.Publish("Hello");
而且在不同的類
StringChangedEvent event
= evManInst.Register<StringChangedEvent>(new StringChangedEvent());
event.Subscribe(this)
當然,該實例應該是同一個。我要傳遞對象,因爲我不能新T() - 但也許我在這裏做一些泛型真邪:-)
如果你讀過我eventmanager進行的實行,將第一回路不會編譯 ,因爲不兼容的類型。我該如何解決這個問題?有趣的是,如果你看代碼,它的類型都很好,沒有什麼可以出錯的(在我看來)。
還有一點:我不想創建一個通用的EventManager<StringChangedEvent>
,因爲這會將此EventManager限制爲一種類型的事件。並返回EventBase
並鑄造它只是醜陋的(但也許唯一的出路?)。
public class EventManager
{
private HashMap<Class<EventBase>, EventBase> _registeredEvents
= new HashMap<Class<EventBase>, EventBase>();
public<T extends EventBase> T Register(T instance)
{
if (_registeredEvents.containsKey(instance.getClass()))
{
return _registeredEvents.get(instance.getClass());
}
else
{
return instance;
}
}
}
編輯從Kaediil澄清答案評論
EventManager x = new EventManager<TestEvent>();
EventManager x2 = new EventManager();
// Not OK
TestEvent t = x.Register(new TestEvent());
// OK (but I want MORE :-)
TestEvent t2 = (TestEvent)x.Register(new TestEvent());
// This to be exact, because then I can do something like this
TestEvent t2 = x.Register<TestEvent>(new TestEvent());
x.Register<TestEvent>(new TestEvent()).CallMethodOfTestEvent();
什麼是編譯錯誤? –
不兼容的類型。他希望我返回T,並且他似乎不知道該實例的類型爲T. –
最後兩次調用的Java語法是'x。註冊',你幾乎不需要使用它。有時候類型推斷算法不能達到你期望的效果,並且它很有用,但通常這隻意味着你的API使用了太多的泛型。 –
millimoose