这基本上是我第一次接触 Java 泛型类型,我无法弄清楚以下代码有什么问题。
我有一个辅助类 Helper
带有静态函数 inRange
usng 泛型类型应该从输入列表中返回对象列表,这些对象在某些 range
at index index
(我还没测试过,能不能用在这里不是问题):
public class Helper {
public static <T> List<T> inRange(List<T> list, int index, int range) {
List<T> res = new ArrayList<T>();
int N = list.size();
assert(index < N);
if (N == 0)
return res;
int i, j;
/* right range */
i = (index + 1) % N;
j = 0;
while (i != index && j < range) {
res.add(list.get(i));
i = (i + 1) % N;
j++;
}
/* left range */
i = (N + index - 1) % N;
j = 0;
while (i != index && j < range && !res.contains(list.get(i))) {
res.add(lista.get(i));
i = (N + i - 1) % N;
j++;
}
return res;
}
}
然后我想在课堂上使用它:
import java.util.ArrayList;
public class StrategyA extends StrategyB {
public Decision makeDecision(GameView gameView, Action action, View playerView) {
int pos = gameView.activePlayersViews().indexOf(playerView);
assert(pos != -1);
ArrayList<View> inRange = Helper.inRange(gameView.activePlayersViews(), pos,
playerView.range());
// todo ...
return new Decision(Decision.KindOfDecision.DO_NOTHING, 0);
}
}
其中 gameView.activePlayersView()
的类型是 ArrayList<View>
。
然后从我的 IDE (IntelliJ IDEA) 在线调用 inRange(..)
我得到
Error:(8, 56) java: incompatible types: no instance(s) of type variable(s) T exist so that java.util.List<T> conforms to java.util.ArrayList<View>
即使我将通用类型 T
直接更改为 View
我仍然会收到此错误
原文由 micsza 发布,翻译遵循 CC BY-SA 4.0 许可协议
最小化您的示例(使用模板化列表类型的整数):
那么即使您将模板类型排除在外:
你看到虽然辅助静态方法返回一个列表,但你试图将它分配给一个 ArrayList,这就是你的问题,因为 ArrayList 是 List 的具体实现,但你不能将对通用 List 的引用分配给具体实现数组列表
只需更改为:
你很高兴: https ://ideone.com/MXZxqz