3

当我从 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;
}
}

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

[错误] 无法执行目标 org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project test: 编译失败
[ERROR] /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 的 beta 版验证此代码段。非常感谢。

PS:我阅读了那些 Eclipse 与 JavaC + Generics 的问题,并且链接的错误声明将得到解决。

4

1 回答 1

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 编译器版本,因为它生成的表达式更易于阅读。

于 2013-11-09T22:59:18.760 回答