chenhz2284
2011-05-05 22:40
采纳率: 100%
浏览 352
已采纳

一段代码在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里面无法通过编译,现在不知道怎么办,请大侠 指点迷津

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

17条回答 默认 最新

  • iihero 2011-05-07 05:03
    已采纳

    只能说eclipse3.3编译时可能有自己的一套编译,所以能成功。
    最终通用的验证手段,个人觉得还得依赖于jdk的命令行。

        List<Map> list1 = null;
        List<Map<String, String>> list2 = null;
        list1 = (List<Map>)list2; 
    

    其实,你将第三行改改,就能都编译了
    list1 = (List)(Object)list2;

    打赏 评论
  • huzhenyu321 2011-05-05 23:22

    3.3与3.4,3.5使用的编译器一样吗?jdk1.5与jdk1.6的编译器还是些许差异的.可能就是你提到的.eclipse提示的信息也能通过jdk的编译器来关联的,所以应该跟eclipse的版本不存在必然的关联(本人推测).

    打赏 评论
  • iteye_2443 2011-05-06 09:17

    同意楼上的,应该是eclipse配置的jdk版本问题

    打赏 评论
  • whimmy 2011-05-06 09:44

    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;

    打赏 评论
  • luxixi3600 2011-05-06 09:49

    绝对是eclipse配置的编译器版本问题,你装的jdk1.6,并不代表你编译的时候就用的jdk1.6,尤其是在用IDE工具的时候。

    告诉你配置在哪里,你自己去看看
    windows----preferences----java----Compiler
    你现在应该能看到了吧。

    打赏 评论
  • skywen_jp 2011-05-06 10:34

    eclipse默认是自己的jdk,3.2应该是1.5, 3.4应该是1.6的jdk,因此提示报错

    参考sheep3600答案

    打赏 评论
  • redstarofsleep 2011-05-06 10:40

    [quote]
    list1 = (List)list2;
    [/quote]
    这句强转有问题啊,list2不是List类型,Map是不可以强转成Map的.

    [code="java"]
    List<?> list1 = null;
    List> list2 = null;
    list1 = list2;
    [/code]

    打赏 评论
  • hongyabing110 2011-05-06 11:22

    你这行代码有问题啊
    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;

    打赏 评论
  • book_chiefsailor 2011-05-06 11:33

    到Eclipse的window/perferences/java/installed jres/菜单下看一下JRE的情况,看看勾选的对不对,最好指定一下你的JRE 1.6,应该就会好了

    打赏 评论
  • iteye_7064 2011-05-06 11:47

    你到 eclipse里面jdk设置里面看看它的编译的jdk设置是否相同?eclipse的编译是和这个设置有关的。

    打赏 评论
  • luxixi3600 2011-05-06 13:38

    那你clear一下吧。

    打赏 评论
  • redstarofsleep 2011-05-06 14:49

    和Eclipse的版本关系应该不大,关键还是JDK的版本.

    你把那代码单独拿出来写个类,用javac编译看看

    打赏 评论
  • whimmy 2011-05-06 16:00

    我再补充一下,据说

    1、eclipse编译使用自己的编译器,主要使用如下jar包
    eclipse\plugins\org.eclipse.jdt.core_xxxxx.jar

    你的两个版本的eclipse的这个包及其相关包可能版本不同

    2、以下为个人观点:你的这个代码在javac是编译不通过的
    之所以在某个版本的eclipse下通过了,是因为该版本eclipse
    编译器帮你进行了某些改动

    打赏 评论
  • iteye_15036 2011-05-06 16:57

    我觉得是原因是:
    1 清理一下项目,重新在eclispe project-build一下,之前能通过,有可能是你的eclipse建了,用户jar ,外部jar 在classpath中,。
    2 你要看一下你设置项目的编译的jdk版本是不是正确的,选中工程,右键preferences----java----Compiler 选中你要的版本,

    打赏 评论
  • iteye_4734 2011-05-06 17:57

    List> list2 = null;
    list2的值为null
    你使用的是只引用
    在编译的时候是无法通过的
    改为
    List> list2 = new ArrayList>();

    打赏 评论
  • 天动 2011-05-06 23:38

    手上没有相应的Eclipse版本.

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

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

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


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

    打赏 评论
  • vinartis-webdesinger 2011-05-07 12:13

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

    打赏 评论

相关推荐 更多相似问题