我尝试从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);
}
答案 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
时不起作用,但如果将进程分开则有效。如果我发现任何事情,我会稍后回来。