当我从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正在声明要解决。
答案 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编译器版本,因为它可以生成更容易阅读的表达式。