问题是没有检查演员表。因此,你必须自己检查。你不能只使用instanceof检查参数化类型,因为参数化类型信息在运行时不可用,在编译时已被擦除。
但是,你可以使用instanceof对散列中的每个项目执行检查,并以此来构造类型安全的新散列。而且你不会招来任何警告。
感谢mmyers和Esko Luontola,我已经将我最初在此处编写的代码参数化了,因此可以将其包装在某个实用程序类中的某个地方,并用于任何参数化的HashMap。如果你想更好地理解它并且对泛型不是很熟悉,建议你查看此答案的编辑历史记录。
public static <K, V> HashMap<K, V> castHash(HashMap input,
Class<K> keyClass,
Class<V> valueClass) {
HashMap<K, V> output = new HashMap<K, V>();
if (input == null)
return output;
for (Object key: input.keySet().toArray()) {
if ((key == null) || (keyClass.isAssignableFrom(key.getClass()))) {
Object value = input.get(key);
if ((value == null) || (valueClass.isAssignableFrom(value.getClass()))) {
K k = keyClass.cast(key);
V v = valueClass.cast(value);
output.put(k, v);
} else {
throw new AssertionError(
"Cannot cast to HashMap<"+ keyClass.getSimpleName()
+", "+ valueClass.getSimpleName() +">"
+", value "+ value +" is not a "+ valueClass.getSimpleName()
);
}
} else {
throw new AssertionError(
"Cannot cast to HashMap<"+ keyClass.getSimpleName()
+", "+ valueClass.getSimpleName() +">"
+", key "+ key +" is not a " + keyClass.getSimpleName()
);
}
}
return output;
}
这项工作量很大,可能只获得很少的报酬…我不确定是否会使用它。对于人们认为是否值得的任何评论,我将不胜感激。另外,我也很高兴提出改进建议:除了抛出AssertionErrors之外,我还能做点更好的事情吗?有什么我可以扔的更好的东西吗?我应该将其设为检查异常吗?