有这样的一段代码:
List list1 = null;
List> list2 = null;
list1 = (List)list2;
在eclipse3.3.2是可以编译通过的,但是有警告:
Multiple markers at this line
- Map is a raw type. References to generic type Map should be parameterized
- Type safety: Unchecked cast from List> to List
但是这段代码在eclipse3.4.2和eclipse3.5.2是不能通过编译的,错误信息是:
Cannot cast from List> to List
我的项目之前是使用myeclipse6.5(eclipse3.3.2)开发的,后来想用flashBuilder4(eclipse3.4.2)打开这个项目,但是里面有些类似上面的代码在eclipse3.4.2里面无法通过编译,现在不知道怎么办,请大侠 指点迷津
只能说eclipse3.3编译时可能有自己的一套编译,所以能成功。
最终通用的验证手段,个人觉得还得依赖于jdk的命令行。
List<Map> list1 = null;
List<Map<String, String>> list2 = null;
list1 = (List<Map>)list2;
其实,你将第三行改改,就能都编译了
list1 = (List)(Object)list2;
3.3与3.4,3.5使用的编译器一样吗?jdk1.5与jdk1.6的编译器还是些许差异的.可能就是你提到的.eclipse提示的信息也能通过jdk的编译器来关联的,所以应该跟eclipse的版本不存在必然的关联(本人推测).
同意楼上的,应该是eclipse配置的jdk版本问题
eclipse编译使用自己的编译器,并不同于jdk中的javac
所以猜测你用的那几个版本的eclipse的编译器并不相同
关于转型
只有将父类转化成子类才可以转型
比如
Object a = null;
String b = (String) a;
如下是不可以的
List a = null;
String b = (String) a;
List并不是List>的父类,故不可以转型
可以改成
List list1 = null;
或
List<?> list1 = null;
绝对是eclipse配置的编译器版本问题,你装的jdk1.6,并不代表你编译的时候就用的jdk1.6,尤其是在用IDE工具的时候。
告诉你配置在哪里,你自己去看看
windows----preferences----java----Compiler
你现在应该能看到了吧。
eclipse默认是自己的jdk,3.2应该是1.5, 3.4应该是1.6的jdk,因此提示报错
参考sheep3600答案
[quote]
list1 = (List)list2;
[/quote]
这句强转有问题啊,list2不是List类型,Map是不可以强转成Map的.
[code="java"]
List<?> list1 = null;
List> list2 = null;
list1 = list2;
[/code]
你这行代码有问题啊
List list1 = null;
List> list2 = null;
list1 = (List)list2;
1.第一行代码 Map中的没有类型
2.第二行代码Map中的类型是String
3.两个list结合对比肯定会错了
总之:集合中的类型不匹配。
应该改为如下:
List> list1 = null;
List> list2 = null;
list1 = (List>)list2;
到Eclipse的window/perferences/java/installed jres/菜单下看一下JRE的情况,看看勾选的对不对,最好指定一下你的JRE 1.6,应该就会好了
你到 eclipse里面jdk设置里面看看它的编译的jdk设置是否相同?eclipse的编译是和这个设置有关的。
那你clear一下吧。
和Eclipse的版本关系应该不大,关键还是JDK的版本.
你把那代码单独拿出来写个类,用javac编译看看
我再补充一下,据说
1、eclipse编译使用自己的编译器,主要使用如下jar包
eclipse\plugins\org.eclipse.jdt.core_xxxxx.jar
你的两个版本的eclipse的这个包及其相关包可能版本不同
2、以下为个人观点:你的这个代码在javac是编译不通过的
之所以在某个版本的eclipse下通过了,是因为该版本eclipse
编译器帮你进行了某些改动
我觉得是原因是:
1 清理一下项目,重新在eclispe project-build一下,之前能通过,有可能是你的eclipse建了,用户jar ,外部jar 在classpath中,。
2 你要看一下你设置项目的编译的jdk版本是不是正确的,选中工程,右键preferences----java----Compiler 选中你要的版本,
List> list2 = null;
list2的值为null
你使用的是只引用
在编译的时候是无法通过的
改为
List> list2 = new ArrayList>();
手上没有相应的Eclipse版本.
3.3是设置为警告了,而较新版本是错误.故此.
3.3的第一个警告是说List,中的Map应该像 list2的定义一样,Map指定k/v的类型.
第二个警告是说会潜在一个castexception的可能.
最好的办法还是修改代码.有明确的类型.
支持 programming 和 iihero的观点,确实是这样的
你这几句代码 javac是不能编译通过的。
你可以通过以下方式测试下,
1、检测你的项目的buildpath设置 查看Jre lib的设置
2、检查eclipse的java的Installed Jre设置