私は、パラメーター化されたイベント用の単純なイベント システムを作成しています。これは、そのクラスをパラメーターとして持つMap
クラスからハンドラーの s までを使用します。Set
私の理解では、パラメーターの制限を介してキーと値の型の間の関係を定義することはできず、セットから要素を引き出す未チェックのキャスト警告が表示されます。
これが私が現在持っているものです:
public class Manager {
private class Event<T> {
// getSubject(), etc.
}
private interface Handler<T> {
public T handleEvent(Event<T> event, T subject);
}
private final Map<Class<?>, Set<Handler<?>>> handlers = new HashMap<Class<?>, Set<Handler<?>>>();
public <T> void post(final Event<T> event, final T subject) {
final Class<?> type = subject.getClass();
if (this.handlers.containsKey(type)) {
for (Handler<?> handler : this.handlers.get(type)) {
// unchecked cast
((Handler<T>) handler).handleEvent(event, subject);
}
}
}
public <T> void register(final Class<T> type, final Handler<T> handler) {
if (!this.handlers.containsKey(type)) {
this.handlers.put(type, new HashSet<Handler<?>>());
}
this.handlers.get(type).add(handler);
}
}
このチェックされていないキャストを回避することは可能ですか? おそらく私の設計に欠陥がありますか?
こことGoogleでかなりの時間を費やしましたが、この取り決めを完全にカバーするものを見つけることができませんでした.