Java泛型不兼容的类型(不存在类型变量T的实例)

时间:2017-05-15 10:20:01

标签: java generics

这基本上是我对Java泛型类型的第一次接触,我无法弄清楚下面的代码有什么问题。

我有一个辅助类Helper,其中包含静态函数inRange usng泛型类型,它应返回输入列表中的对象列表,这些列表位于索引{range处的对象周围{1}}(我还没有测试过它,如果它能正常工作,它不是问题):

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我仍然会收到此错误

5 个答案:

答案 0 :(得分:5)

最小化您的示例(使用模板化列表类型的整数):

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;
    }
}

然后即使你把模板类型放在图片之外:

ArrayList inRange = Helper.inRange(list, 0,1);

public static List inRange(List list, int index, int range) { ... }

你看到帮助器静态方法返回一个List,你试图将它分配给一个ArrayList,这就是你的问题,因为ArrayList是List的具体实现,但你不能指定一个ArrayList

的具体实现的通用List

只需更改为:

List<View> inRange = Helper.inRange(gameView.activePlayersViews(), pos, 
        playerView.range());

你很高兴:https://ideone.com/MXZxqz

答案 1 :(得分:3)

ArrayListList界面的实现 因此,所有ArrayList个实例都是List个实例,但所有List个实例都不一定是ArrayList

所以当你调用这个方法时:

public static <T> List<T> inRange(List<T> list, int index, int range) {

您不能像以前那样将结果分配给ArrayList

ArrayList<View> inRange = Helper.inRange(...);

继续按界面编程,并在两边使用List

List<View> inRange = Helper.inRange(...);

答案 2 :(得分:2)

会发生这种情况,因为inRange()会返回类型List<T>。您可以使用类型List或任何超类型存储结果。

尝试使用此代码:

List<View> inRange = Helper.inRange(gameView.activePlayersView(), pos, 
            playerView.range());

答案 3 :(得分:2)

尝试:

List<View> inRange = Helper.inRange(gameView.activePlayersView(), pos, 
        playerView.range());

并检查一下:

res.add(lista.get(i));

此课程中没有lista

答案 4 :(得分:2)

您需要将ArrayList类型转换为List

ArrayList<View> inRange = Helper.inRange((List<View>) gameView.activePlayersViews(), pos, 
playerView.range());