当前位置: 首页 > 知识库问答 >
问题:

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

索曾琪
2023-03-14

这基本上是我第一次接触Java泛型类型,我不知道下面的代码有什么问题。

我有一个helper类,它具有一个静态函数inRange-usng-generic类型,该函数应该从输入列表中返回对象列表,这些对象在索引处的对象周围的特定范围内(我还没有测试它,如果它工作正常与否,这不是问题):

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

然后从我的IDE(IntelliJ IDEA)在线调用inRange(...)我得到

<代码>错误:(8,56)java:不兼容的类型:不存在类型变量T的实例,因此java。util。列表

即使我将泛型类型直接更改为视图,我仍然会遇到这个错误


共有3个答案

万高轩
2023-03-14

发生这种情况是因为inRange()返回类型List

尝试使用此代码:

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

南宫阳冰
2023-03-14

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

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) { ... }

您可以看到,虽然helper静态方法返回一个列表,但您试图将其分配给ArrayList,这是您的问题,因为ArrayList是List的具体实现,但您不能将对泛型列表的引用分配给ArrayList的具体实现

只需更改为:

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

你可以走了:https://ideone.com/MXZxqz

鲁霄
2023-03-14

ArrayList是List接口的一个实现
因此,所有的ArrayList实例都是List实例,但所有的List实例不一定都是ArrayList

因此,当您调用此方法时:

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

您不能像这样将其结果分配给ArrayList

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

继续按界面编程,并在两侧使用列表:

List<View> inRange = Helper.inRange(...);
 类似资料:
  • 我定义jackoson序列化器并将其添加到java类中,如下所示: 编译器出现以下错误: 注释的定义为: 如果我从ReportFilterDeserializer中删除泛型attibute,它将通过编译。我不明白编辑为什么抱怨。

  • 我有以下代码 出于某种原因,它抛出了以下编译错误 Solution.java:11:错误:不兼容类型:推断变量T具有不兼容的边界List=Arrays.asList(A);^相等约束:整数下界:int[]其中T是类型变量:T扩展方法中声明的Object asList(T...) 我假设这是一个Java8功能但我不知道如何解决这个错误

  • 和是的一部分,如下所示:

  • 错误:(65,52)java:不兼容类型:推理变量U的边界不兼容等式约束:akka。http。javadsl。模型HttpResponse下限:com。我的演员。聊天演员。聊天信息 下面这行代码显示了错误: 这里是HttpResponse是Akka Http的。 我不知道它在说什么。解决它的方法应该是什么?

  • JDK 1.8 设置和收集。 我想数一数那个十字路口 我试试这个: 但我有一个错误: