代码不能在Android Studio中编译,但在Eclipse中编译

时间:2013-11-19 08:56:45

标签: java android eclipse android-studio

我尝试从Eclipse迁移到Android Studio。代码在Eclipse中编译和工作,但不能在Android Studio中编译。

有问题的代码是将列表从类型转换为子类型列表。它使用了使用泛型的方法mapList。

Android Studio抱怨mapList的参数与结果类型相同。

代码或Android Studio是否有问题?

public class Fruit {
}

public class Banana extends Fruit {
}

private <D, S extends D> List<D> mapList(List<S> sourceList) {
    List<D> result = new ArrayList<D>();

    for(S sourceElement : source) {
        result.add((D) sourceElement);
    }

    return result;
}

private void bananaToFruit() {
    List<Banana> bananaList = new ArrayList<Banana>();
    List<Fruit> fruitList = mapList(bananaList);
}

2 个答案:

答案 0 :(得分:2)

在Eclipse中,您可能正在使用Eclipse编译器(ecj)。 Android Studio使用Gradle,它使用Java命令行编译器(javac)。这不是Android Studio的问题,而是两个编译器如何处理泛型的区别。在这种情况下,我不确定哪一个表现正确。

如果您使用普通的IntelliJ,您可以选择使用Eclipse编译器,但如果您使用的是带有基于Gradle的项目的Android Studio,那么您只能使用javac。有可能让Gradle使用ecj,但我认为没有任何简单的设置;你可能不得不攻击Gradle本身。

快速搜索显示这个问题比较javac和ecj,它有一些链接可能会对它有更多启示:

What is the difference between javac and the Eclipse compiler?

答案 1 :(得分:0)

不知何故,此代码适用于Intellij(也可能是Android Studio)

private <D, S extends D> D[] mapArray(List<S> sourceList) {
        List<D> result = new ArrayList<D>();
        result.addAll(sourceList);
        return (D[]) result.toArray();
    }

private void bananaToFruit() {
        List<Banana> list = new ArrayList<Banana>();
        Fruit[] data = mapArray(list);
        List<Fruit> fruitList = Arrays.asList(data);
    }

但是,我无法弄清楚为什么它在调用mapList时不起作用,但如果将进程分开则有效。如果我发现任何事情,我会稍后回来。