Java泛型真的是鸡肋吗?
2016-12-26 13:58
今天遇到一个小问题,让我感觉Java的泛型(因为背负了历史的包袱导致的)有点鸡肋啊。
我们经常会遇到要一些自定义的key-value字符串,比如:
"key1:1k;key2:2;key3:3"
通常编码的时候会将它转换为一个Map这样方便操作,因为key和value的类型不一定(可能是int也可能是String等),于是我用Java写了一个简单的泛型方法:
@SuppressWarnings("unchecked")
public static Map getMap(String source, String firstSplit, String secondSplit) {
Map result = new HashMap();
if (source.equals("")) {
return result;
}
String[] strings = source.split(firstSplit);
for (int i = 0; i < strings.length; i++) {
String[] tmp = strings[i].split(secondSplit);
if (tmp.length == 2) {
result.put((K) tmp[0], (V) tmp[1]);
// System.out.println("(K) tmp[0]:"+((K) tmp[0]).getClass());
// System.out.println("(V) tmp[1]:"+((V) tmp[1]).getClass());
}
}
return result;
}
看上去貌似可以正常工作的,用上面的字符串举例子,我应该希望得到的是Map这样一个结果。
String test = "key1:1k;key2:2;key:3";
Map map = getMap(test, ";", ":");
for (Entry entry : map.entrySet()) {
Integer value = entry.getValue();
}
上面的代码编译时完全没问题的,但是一运行:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at ossp.demo.generic.GenericDemo.main(GenericDemo.java:38)
报的是类型转换错误,String不能转换为Interger类型?但是明明entry.getValue()结果就是Interger类型啊,难道不是吗?
一开始很疑惑,但稍微一想就明白了,哦!Java泛型用的是“擦除”法,完全是编译期的,运行时已经没有泛型参数的类型信息了,也就是说运行时所有的泛型参数都被替换成了Object(如果有泛型约束(.net是这么叫的)是不是就替换成上限类型?)所以上面的泛型方法其实就等价于:
public static Map