Java Maven编译器与Eclipse编译器泛型的区别?

Java Maven编译器与Eclipse编译器泛型的区别?,java,eclipse,generics,Java,Eclipse,Generics,当我从Eclipse构建到maven构建时,我发现了项目中的许多问题。我使用2.5.1编译器插件 JDK是open-JDK-7 我在一个新项目中隔离了这个问题,并将其消除。问题是: public class Test { public static void main(String[] args) { List<String> list = newList(); for(String name : sort(newList(list))) { Sys

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

JDK是open-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;
}
}
公共类测试{
公共静态void main(字符串[]args){
List=newList();
for(字符串名称:排序(新列表(列表))){
System.out.println(名称);
}
}
公共静态列表newList(){
返回新的ArrayList();
}
公共静态列表newList(集合列表){
返回新的ArrayList();
}
公共静态列表排序(列表){
退货清单;
}
}
这无法使用javaC进行编译(但在Eclipse中工作),并说明以下错误:

[错误]无法执行目标org.apache.maven.plugins:maven编译器插件:2.5.1:compile(默认编译)on project测试:编译失败
[错误]/home/username/workspace/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;
    }
}
公共类测试{
公共静态void main(字符串[]args){
List=newList();
for(字符串名称:排序(新列表(列表))){
System.out.println(名称);
}
}
公共静态列表newList(){
返回新的ArrayList();
}

公共静态列表newList(Collection我记得2008年我们采用Java 5.0时,同样的问题也是一个问题。这与eclipse编译器处理泛型的方式略有不同有关

如果您检查上面的示例,JavaC编译器不允许传递泛型解析。例如,让我们看一下:

List<String> strings = sort(newList("A", "B", "C");
List strings=sort(newList(“A”、“B”、“C”);
JavaC在这里抱怨说sort不适用于List

<T> List<T> sort(List<T>) {...};
<T> List<T> newList(T ... elements) {};
列表排序(List){…};
列出新列表(T…元素){};
解决方案是引入一个变量,破坏上述表达式的美观:

List<String> list = newList("A", "B", "C");
List<String> strings = sort(list);
List List=newList(“A”、“B”、“C”);
列表字符串=排序(列表);

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

您是否在pom中将maven编译器插件的源和目标版本配置为1.7?()是的。正如我所说,我刚刚将E改为a?T,它可以工作。所以这不是Java版本的问题。我猜切换到1.5时它也会失败,但我还没有尝试。