java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
问题背景
- 接口中参数为
Map<String,Object>
取出某 KEY 值时,强制将其转为 String ,出现上述异常
问题分析
- 以
Map<String,Object>
作为参数的原因:可以传递多个参数;若使用 PO 类作为参数,不同项目中引用时需升级版本; - 出现问题的原因:对外提供接口,没有在接口上明确注释,某个key的value是什么类型,只有当时写此接口的人才会避免此问题,其他调用者则不清楚,在调用接口后对结果进行了强制转换
- 代码级别分析:问题的根本是泛型与Object的区别
public static void main(String[] args) {
Map<String,Object> params = new HashMap<String,Object>();
params.put("1", 1);
String result = (String)params.get("1");
System.out.println(result);
}
问题:
- map.get(“”) 返回类型为 Object ,为何将 Object 转为 String 时出现异常?
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
public V put(K key, V value) {
}
Map<String,Object> params = new HashMap<String,Object>();
params.put("1",1);
params.put(2,2) ;
Object object = params.get("1");
if(object instanceof Integer){
System.out.println("true");
}
String result1 = String.valueOf(object);
System.out.println(result1);
问题总结
泛型
泛型常用表示及含义
- E – Element (在集合中使用,因为集合中存放的是元素)
- T – Type(Java 类)
- K – Key(键)
- V – Value(值)
- N – Number(数值类型)
- ? – 表示不确定的java类型(无限制通配符类型)
- S、U、V – 2nd、3rd、4th types
参考资料