当我从 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 的问题,并且链接的错误声明将得到解决。