备注:
前端时间在做java的时候,需要将前端js的数据传递并填充到JavaBean中,
JavaBean中用List进行接收,如下:
List<BeanName> list;
public List<BeanName> getList()...
public List<BeanName> setList(..)...
然后在方法调用的时候
1、List<BeanName> userList = user.getList();
2、for(BeanName bean : userList){
.......
}
在执行到第二行的时候报错,错误提示
ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to com.xxx.BeanName
当时感觉非常的神奇,用List<BeanName> userList 都可以存 user.getList();
为啥循环就无法转换类型呢?
查看了下相应的文档才发现原来Java中的泛型只是在编译期有限制类型的作用,在运行期是不起到限制作用的。
可以用下面的代码做模拟测试:
//模拟运行期,会将泛型限制忽略
List listObj = new ArrayList();
listObj.add(new Object());
//模拟编译期,加入泛型限制
List<String> listStr = new ArrayList<String>();
listStr.add("test");
//1、可以看到[运行期]的任何类型的数据最后是可以添加到泛型集合中的,因为在运行期没有泛型的限制和存在
//2、虽然过了代码编译这一关,没错误提示,但是在下面循环运行的时候,就会报错了,
listStr.addAll(listObj);
//循环List测试
for (String str : listStr) {
System.out.println(str);
}
Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.String
at com.rule.Test.main(Test.java:35)
可以看到在循环的时候提示无法转换,这就是为什么 ,“明明数据可以存储,但是却无法遍历循环的原因!”。
总结:
而出现 ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to com.xxx.xxx
这种错误的大部分原因就是因为不同语言之间数据传递,进行数据封装和解析的时候出现,因为在不同语言之间数据传递 ,数据的格式不好控制,在编译期
错误没有体现出来,只有在运行期间才会报错出来。
如果都是在同一个语言平台上,比如java中 进行数据转换,泛型发现类型不对,编译器就会马上提示错误,红叉,编译不通过。