Maven Compiler与Eclipse Compiler Generics的区别?

时间:2013-11-06 21:59:39

标签: java eclipse generics

当我从Eclipse构建到maven构建时,我发现了我的项目中的许多问题。我使用2.5.1编译器插件。

JDK是开放的-JDK-7

我在一个新项目中解决了这个问题并将其解决了问题:

public class Test {

public static void main(String[] args) {
    List<String> list = newList();
    for(String name : sort(newList(list))) {
        System.out.println(name);
    }
}

public static <T> List<T> newList() {
    return new ArrayList<T>();
}

public static <T, E extends T> List<T> newList(Collection<E> list) {
    return new ArrayList<T>();
}

public static <T> List<T> sort(List<T> list) {
    return list;
}
}

无法使用javaC编译(但在Eclipse中工作),说明以下错误:

  

[错误]无法执行目标org.apache.maven.plugins:maven-compiler-plugin:2.5.1:项目测试时编译(default-compile):编译失败
  [错误] /home/username/workspaces/projectx43/test/src/main/java/test/Test.java:[11,24]错误:不兼容的类型

这将有效:

public class Test {

    public static void main(String[] args) {
        List<String> list = newList();
        for(String name : sort(newList(list))) {
            System.out.println(name);
        }
    }

    public static <T> List<T> newList() {
        return new ArrayList<T>();
    }

    public static <T> List<T> newList(Collection<? extends T> list) {
        return new ArrayList<T>();
    }

    public static <T> List<T> sort(List<T> list) {
        return list;
    }
}

每个人都可以看到带有E的版本和仅使用T的版本一样好。现在的问题是,我可以调整javac编译器来接受它。任何有关这方面的信息将不胜感激。

还有另一种可能性:openJDK 7是否以不同的方式处理SunJDK 7?如果您可以使用最新的Windows Sun JDK 7版本甚至是JDK 8的测试版验证此代码段。非常感谢。

PS:我读过那些Eclipse与JavaC + Generics的问题,并且链接的Bugs正在声明要解决。

1 个答案:

答案 0 :(得分:3)

我记得2008年采用Java 5.0时,同样的问题是一个问题。这与eclipse编译器稍微不同地处理泛型的事实有关。

如果查看上面的示例,JavaC编译器不允许传递泛型解析。举个例子,我们来看看:

List<String> strings = sort(newList("A", "B", "C");

JavaC在这里抱怨说排序不适用于List。

<T> List<T> sort(List<T>) {...};
<T> List<T> newList(T ... elements) {};

解决方案是引入一个破坏上述表达之美的变量:

List<String> list = newList("A", "B", "C");
List<String> strings = sort(list);

这取决于是否有人认为这是一个错误。我更喜欢Eclipse编译器版本,因为它可以生成更容易阅读的表达式。