kaz*_*gul 3 java generics casting classcastexception
我发现Java中的演员有些奇怪,我之前从未见过.在通用方法中编程时,实际上没有完成转换.
测试奇怪的事情.
在HashMap上:
HashMap<String,Object> map = ...
map.put("hello", "World");
System.err.println((Integer)map.get("hello")); // -----> ClassCastException
Run Code Online (Sandbox Code Playgroud)
在地图上包装
MapWrap wrap = ...
wrap.put("hello", "World");
System.err.println(wrap.get("hello",Integer.class)); // -----> don't cast, print World (i guess because println receives an Object reference but the cast should be done before that).
System.err.println(wrap.get("hello", Integer.class).toString()); // -----> print World + ClassCastException
Run Code Online (Sandbox Code Playgroud)
方法代码:
private <T> T get(String key, Class<T> c){
return (T)map.get(key);
}
private Object get(String key){
return map.get(key);
}
Run Code Online (Sandbox Code Playgroud)
有人知道mechansim是否有名字或者知道一些事情吗?
谢谢
演员:
(T) map.get(key);
Run Code Online (Sandbox Code Playgroud)
由于类型擦除,根本不做任何事情.该方法MapWrap.get()
将被删除为:
private Object get(String key, Class<T> c){
return map.get(key);
}
Run Code Online (Sandbox Code Playgroud)
这将永远有效.只有在为此方法的结果赋值时才会插入到Integer的转换,并且因为在第一个MapWrap
示例中,您将它传递给需要Object参数的方法,所以不会发生这种情况.
在第二种情况下,您尝试调用该方法Integer.toString()
,因此插入到Integer的转换,并失败.
你已经传入了类对象,执行"泛型转换"的正确方法是这样的:
private <T> T get(String key, Class<T> c){
return c.cast(map.get(key));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
798 次 |
最近记录: |