public class StrictMap<V> extends HashMap<String, V> {
private static final long serialVersionUID = -3455861209780003757L;
private String name;
public StrictMap(int initialCapacity, float loadFactor, String name) {
super(initialCapacity, loadFactor);
this.name = name;
}
public StrictMap(int initialCapacity, String name) {
super(initialCapacity);
this.name = name;
}
public StrictMap(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public V put(String key, V value) {
if (containsKey(key)) {
throw new RuntimeException("已经存在的key, keyName = " + key);
}
if (key.contains(".")) {
final String shortName = getShortName(key);
if (containsKey(shortName)) {
// question 这边有个问题, 为什么没有抛出ClassCastException。
V ambiguity = (V) new Ambiguity("存在的shortName");
super.put(shortName, ambiguity);
} else {
super.put(shortName, value);
}
}
return super.put(key, value);
}
@Override
public V get(Object key) {
V value = super.get(key);
if (value == null) {
throw new RuntimeException("keyName = " + key + ", 没有获取到value.");
}
if (value instanceof Ambiguity) {
throw new RuntimeException("重复的shortName");
}
return value;
}
static class Ambiguity {
private String name;
public Ambiguity(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
}
ps: Tiada ralat dilaporkan semasa berjalan.
Jenis pemadaman ialah Objek, dan tiada ralat akan dilaporkan apabila penukaran paksa kepada Objek.
Hanya akan ada amaran semasa penyusunan dan tiada ralat akan dilaporkan. Rangka Kerja Koleksi Java sebenarnya penuh dengan pemindahan paksa sedemikian.
Tetapi ralat akan dilaporkan semasa berjalan, jika V bukan Kekaburan atau kelas induknya.