【发布时间】:2014-09-13 04:45:53
【问题描述】:
我有一些看起来像这样的代码(方法 get 的否定测试的一部分):
import java.util.*;
public class Test {
Map<String, Object> map = new HashMap<>();
public static void main (String ... args) {
Test test = new Test();
test.put("test", "value"); // Store a String
System.out.println("Test: " + test.get("test", Double.class)); // Retrieve it as a Double
}
public <T> T get(String key, Class<T> clazz) {
return (T) map.get(key);
}
public void put(String key, Object value) {
map.put(key, value);
}
}
我原以为它会抛出ClassCastException,但它会成功打印:
Test: value
为什么不扔?
【问题讨论】:
-
System.out.println调用打印什么? -
我感觉这与为什么不能为泛型类型参数传递原始类型的原因相同。您是否尝试过将
Map中的值从Object更改为其他值,例如String?也许是因为Object的多态属性而被允许的 -
@mariosangiorgio : 它打印
Test: value。 -
有趣的是,
test.get("test", Double.class).doubleValue()确实抛出了ClassCastException。 -
当编译器清楚地警告您演员未检查时,您为什么会期待
ClassCastException?
标签: java generics classcastexception