这基本上是我对Java泛型类型的第一次触摸,我无法弄清楚下面这段代码有什么问题.
我有一个Helper带有静态函数inRangeusng泛型类型的辅助类,它应该返回一个输入列表中的对象列表,这些列表range位于索引周围的某个对象周围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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我想在课堂上使用它:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
哪里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我仍然会收到此错误
ArrayList是List接口的实现。
因此,所有ArrayList实例都是List实例,但List并非所有实例都必须是ArrayList。
所以当你调用这个方法时:
public static <T> List<T> inRange(List<T> list, int index, int range) {
Run Code Online (Sandbox Code Playgroud)
您不能将其结果分配给ArrayList您正在执行的操作:
ArrayList<View> inRange = Helper.inRange(...);
Run Code Online (Sandbox Code Playgroud)
继续按接口编程,List两边使用:
List<View> inRange = Helper.inRange(...);
Run Code Online (Sandbox Code Playgroud)
尽量减少您的示例(使用模板化List类型的Integer):
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
List<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> inRange = Helper.inRange(list, 0,1);
}
}
class Helper {
public static <T> List<T> inRange(List<T> list, int index, int range) {
List<T> res = new ArrayList<T>();
return res;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,即使您将模板类型放在图片之外:
ArrayList inRange = Helper.inRange(list, 0,1);
public static List inRange(List list, int index, int range) { ... }
Run Code Online (Sandbox Code Playgroud)
您会看到,当辅助静态方法返回List时,您正在尝试将其分配给ArrayList,这就是您的问题,因为ArrayList是List的具体实现,但是您无法将对通用List的引用分配给具体实现的ArrayList
只需更改为:
List<View> inRange = Helper.inRange(gameView.activePlayersViews(), pos,
playerView.range());
Run Code Online (Sandbox Code Playgroud)
而且你很高兴去:https : //ideone.com/MXZxqz
| 归档时间: |
|
| 查看次数: |
31295 次 |
| 最近记录: |