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

新手上路,请多包涵

这基本上是我第一次接触 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 许可协议

阅读 2.7k
2 个回答

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

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

你看到虽然辅助静态方法返回一个列表,但你试图将它分配给一个 ArrayList,这就是你的问题,因为 ArrayList 是 List 的具体实现,但你不能将对通用 List 的引用分配给具体实现数组列表

只需更改为:

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

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

原文由 guido 发布,翻译遵循 CC BY-SA 3.0 许可协议

ArrayListList 接口的实现。

So all ArrayList instances are List instances but all List instances are not necessarily 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(...);

原文由 davidxxx 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题