私はそれがでチェックコンパイル時間を達成することが可能だとは思わない:あなたは、このようなマップを受け入れるようにする方法を必要とすることができます - あなたは、新しいクラスを定義する必要はありません、と述べた
Javaジェネリックス。しかし、それは実行時に非常に簡単です。ちょうど短いデコレータ:それはどのように動作するか
public class FancyTypeMapDecorator implements Map<Set<? extends Object>, Object> {
final Map<Set<? extends Object>, Object> target;
public FancyTypeMapDecorator(Map<Set<? extends Object>, Object> target) {
this.target = target;
}
@Override
public Object put(Set<? extends Object> key, Object value) {
final Class<?> keyElementType = key.iterator().next().getClass();
final Class<?> valueType = value.getClass();
if (keyElementType != valueType) {
throw new IllegalArgumentException(
"Key element type " + keyElementType + " does not match " + valueType);
}
return target.put(key, value);
}
@Override
public void putAll(Map<? extends Set<? extends Object>, ? extends Object> m) {
for (Entry<? extends Set<? extends Object>, ? extends Object> entry : m.entrySet()) {
put(entry.getKey(), entry.getValue());
}
}
//remaining methods are simply delegating to target
}
がここにあります:put
final Map<Set<? extends Object>, Object> map =
new FancyTypeMapDecorator(new HashMap<Set<? extends Object>, Object>());
Set<? extends Object> keyA = Collections.singleton(7);
map.put(keyA, 42);
Set<? extends Object> keyB = Collections.singleton("bogus");
map.put(keyB, 43);
第二には、例外がスローされます。
しかし、両方の実装(と私はそれが空のためにキーとして失敗することを意味しない)と使用/ APIはアラームベルをトリガします...本当にそのような構造に対処したいですか?おそらくあなたはあなたの問題を再考する必要がありますか?あなたは何ですか実際にを達成しようとしていますか?
は、あなたが期待しているが、その入れた後、空の '設定し'が続く中で、空の 'を設定します'空の 'Set 'はマップされないか、 'String'を返します(' ClassCastException'を投げます)? –