在eclipse和maven之间使用类型转换的不同编译行为

时间:2013-10-09 08:31:29

标签: java eclipse compiler-errors

这是我的代码示例:

private static void fac(Map<? extends Serializable,? extends Serializable> mapTo){
    //do sth.
}

public static void main(String[] args) {
    Map<String,Object> mapFrom=null;
    fac((Map<? extends Serializable, ? extends Serializable>) mapFrom);     
}

上面的代码在eclipse中成功编译(带有类型安全警告),但在maven中失败(由javac引起的“不兼容类型”错误?)。

现在我必须改变我的代码:

public static void main(String[] args) {
    Map<String,Object> mapFrom=null;
    fac((Map) mapFrom);     
}

我已经确认java版本是一样的,我的问题是:

  1. 为什么他们有不同的行为?

  2. 编写代码的首选方法是什么?

2 个答案:

答案 0 :(得分:1)

Eclipse带有自己的Java编译器; Maven使用javac。大多数情况下,两者都接受相同的代码,但泛型很复杂,编译器也有错误。例如,Java 6的javac中存在一些已知错误,这些错误会导致问题。

Oracle不会修复它们。解决方案是使用Java 7运行Maven并配置maven-compiler-plugin生成Java 6字节代码(请参阅Kumar Sambhav's answer)。

答案 1 :(得分:0)

尝试将此插件(内置build-&gt; plugins-&gt;标记)添加到您的pom.xml: -

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>

这将确保编译器版本与您的项目一起使用。