哇,我想出了我自己问题的答案。我只是不确定这是否值得!)
问题是演员没有被检查。所以,你得自己检查一下。不能只检查带有instanceof的参数化类型,因为参数化类型信息在运行时不可用,在编译时已被擦除。
但是,您可以使用instanceof对散列中的每一项执行检查,在此过程中,您可以构造一个类型安全的新哈希。你也不会引起任何警告。
感谢mmyers和EskoLuontola,我已经参数化了我在这里最初编写的代码,因此它可以封装在某个实用程序类中,并用于任何参数化HashMap。如果您想更好地理解它并且不太熟悉泛型,我鼓励您查看这个答案的编辑历史。public static HashMap castHash(HashMap input,
Class keyClass,
Class valueClass) {
HashMap output = new HashMap();
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
+", "+ valueClass.getSimpleName() +">"
+", value "+ value +" is not a "+ valueClass.getSimpleName()
);
}
} else {
throw new AssertionError(
"Cannot cast to HashMap
+", "+ valueClass.getSimpleName() +">"
+", key "+ key +" is not a " + keyClass.getSimpleName()
);
}
}
return output;}
这是一项很大的工作,可能是为了很少的报酬.我不确定我是否会用它。对于人们是否认为这是值得的,我将不胜感激。另外,我希望有一些改进的建议:除了扔AssertionError之外,我还能做些更好的事情吗?我能扔点更好的东西吗?我应该让它成为一个被检查的例外吗?