Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型不兼容类型(不存在类型变量的实例)_Java_Generics - Fatal编程技术网

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

Java泛型不兼容类型(不存在类型变量的实例),java,generics,Java,Generics,这基本上是我第一次接触Java泛型类型,我不知道下面的代码有什么问题 我有一个helper类helper,带有一个静态函数inRangeusng泛型,它应该从输入列表中返回对象列表,这些对象在indexindex处的对象周围处于特定的范围内(我还没有测试过它,如果它工作正常与否,这不是问题): 公共类助手{ 范围内的公共静态列表(列表列表、整数索引、整数范围){ List res=new ArrayList(); int N=list.size(); 断言(索引

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

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

公共类助手{
范围内的公共静态列表(列表列表、整数索引、整数范围){
List res=new ArrayList();
int N=list.size();
断言(索引
然后我想在课堂上使用它:

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

}
}
import java.util.ArrayList;
公共类策略A扩展了策略B{
公共决策制定决策(GameView GameView、Action Action、View playerView){
int pos=gameView.activePlayersViews().indexOf(playerView);
断言(pos!=-1);
ArrayList inRange=Helper.inRange(gameView.ActivePlayerView(),位置,
playerView.range());
//待办事项。。。
返回新决策(Decision.KindOfDecision.DO_NOTHING,0);
}
}
其中
gameView.ActivePlayerView()
的类型为
ArrayList

然后从我的IDE(IntelliJ IDEA)在线调用
inRange(…)

错误:(8,56)java:不兼容的类型:不存在类型变量T的实例,因此java.util.List符合java.util.ArrayList

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

即使我将泛型类型
T
直接更改为
View
,我仍然会遇到这个错误,因为
inRange()
返回类型
列表
。您可以使用类型
列表
或任何超类型将结果存储在引用中

请尝试使用以下代码:

List<View> inRange = Helper.inRange(gameView.activePlayersView(), pos, 
            playerView.range());
List inRange=Helper.inRange(gameView.activePlayersView(),pos,
playerView.range());
尝试执行以下操作:

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

此类中没有lista

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

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

只需更改为:

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

您可以开始了:

您需要将类型
ArrayList
转换为
List

ArrayList<View> inRange = Helper.inRange((List<View>) gameView.activePlayersViews(), pos, 
playerView.range());
ArrayList inRange=Helper.inRange((列表)gameView.ActivePlayerView(),位置,
playerView.range());

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

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

public static <T> List<T> inRange(List<T> list, int index, int range) {
继续按界面编程,并在两侧使用
列表

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

inRange
返回
List
,而不是
ArrayList
,对于初学者
inRange
确实返回
列表
,您正试图将其分配给
ArrayList
。这是不可能的,尽管我预期会出现不同的错误。没有lista,因为我手动将它从我的本地语言标识符翻译过来。解决方案还是有帮助的,tks
ArrayList<View> inRange = Helper.inRange((List<View>) gameView.activePlayersViews(), pos, 
playerView.range());
public static <T> List<T> inRange(List<T> list, int index, int range) {
ArrayList<View> inRange = Helper.inRange(...);
List<View> inRange = Helper.inRange(...);