我不認爲這是可能實現的編譯時間檢查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
}
下面是它如何工作的:
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);
二put
拋出異常。
然而,這兩個實現(我甚至不意味着它會失敗的空Set
作爲一個關鍵)和使用/ API觸發警鐘......你真的想要處理這樣的結構?也許你需要重新考慮你的問題?你究竟是試圖實現?
你期待的是把後一個空'設置'在跟隨一個空'設置' ,一個空的'Set '將被取消映射或返回一個'String'(/拋出'ClassCastException')? –