首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Maven编译器与Eclipse编译器泛型的区别?

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

Stack Overflow用户
提问于 2013-11-06 21:59:39
回答 1查看 1.2K关注 0票数 3

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

JDK是开放的-JDK-7

我在一个新项目中孤立了这个问题,并把它抑制下来,问题是:

代码语言:javascript
复制
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错误:不兼容类型

这是可行的:

代码语言:javascript
复制
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声明要解决这些问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-09 22:59:18

2008年,当我们采用Java5.0时,我还记得同样的问题。这只是与eclipse编译器处理泛型略有不同这一事实有关。

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

代码语言:javascript
复制
List<String> strings = sort(newList("A", "B", "C");

JavaC在这里抱怨说,这种排序不适用于列表。

代码语言:javascript
复制
<T> List<T> sort(List<T>) {...};
<T> List<T> newList(T ... elements) {};

解决方案是引入一个变量,破坏上述表达式的美:

代码语言:javascript
复制
List<String> list = newList("A", "B", "C");
List<String> strings = sort(list);

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19823705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档