インターフェイスを拡張するMultimap<Void, Condition<?>>
と、ユーザーはタイプセーフティに依存しないいくつかのメソッド(containsKeyなど)を呼び出すことができますが、チェックされていないキャストを使用しない限り、エントリを追加することはできません(タイプチェックされたプロキシメソッドをバイパスします)。
interface ConditionMapBase<T> extends Multimap<T, Condition<?>> {
}
interface ConditionMap extends ConditionMapBase<Void> {
<T>boolean putCondition(T key, Condition<T> value);
<T>Collection<Condition<T>> getConditions(T key);
}
class ConditionMapImpl
extends ForwardingMultimap<Void, Condition<?>>
implements ConditionMap {
ConditionMapImpl() {
delegate = HashMultimap.create();
}
@SuppressWarnings("unchecked")
@Override
protected Multimap<Void, Condition<?>> delegate() {
return (Multimap<Void, Condition<?>>) (Multimap<?, ?>) delegate;
}
private final Multimap<Object, Condition<?>> delegate;
@SuppressWarnings("unchecked")
@Override
public <T> Collection<Condition<T>> getConditions(T key) {
return (Collection<Condition<T>>) (Collection<?>) ((ConditionMapBase<T>) this).get(key);
}
@SuppressWarnings("unchecked")
@Override
public <T> boolean putCondition(T key, Condition<T> value) {
return ((ConditionMapBase<T>) this).put(key, value);
}
}