一段代码在eclipse3.3.2可以编译,但在eclipse3.4.2不行

有这样的一段代码:
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版本.

看上去应该只是相应的设置不一样:工程-->右键属性-->Java Compiler-->Errors/Warnings-->Generic Types

3.3是设置为警告了,而较新版本是错误.故此.

3.3的第一个警告是说List,中的Map应该像 list2的定义一样,Map指定k/v的类型.
第二个警告是说会潜在一个castexception的可能.


最好的办法还是修改代码.有明确的类型.

支持 programming 和 iihero的观点,确实是这样的
你这几句代码 javac是不能编译通过的。
你可以通过以下方式测试下,
1、检测你的项目的buildpath设置 查看Jre lib的设置
2、检查eclipse的java的Installed Jre设置