当我从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: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 7版本,甚至是JDK 8的beta版本来验证这个片段,那么非常感谢。
PS:我读过Eclipsevs.JavaC+泛型的问题,链接的Bugs声明要解决这些问题。
发布于 2013-11-09 22:59:18
2008年,当我们采用Java5.0时,我还记得同样的问题。这只是与eclipse编译器处理泛型略有不同这一事实有关。
如果您检查上面的示例,JavaC编译器不允许传递泛型解析。举个例子,让我们看看以下内容:
List<String> strings = sort(newList("A", "B", "C");JavaC在这里抱怨说,这种排序不适用于列表。
<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编译器版本,因为它产生更容易阅读的表达式。
https://stackoverflow.com/questions/19823705
复制相似问题