Java 返回数据类型不匹配

Java 返回数据类型不匹配,java,multithreading,callable,countdownlatch,Java,Multithreading,Callable,Countdownlatch,我面临重新分级指定返回数据类型的问题。我有一个实现callable的FOComp类,'FOComp'的call()方法返回数据类型List,如下面的'FOComp'类的代码所示 方法“getResults()”返回类型为ArrayList的数据,如下面的代码所示。目前,在运行时,当我执行代码时,我收到以下错误: 这条线上有多个标记 返回类型与Callable.call()不兼容 返回类型与Callable.call()不兼容 请告诉我如何修理它 'FOComp'类: static c

我面临重新分级指定返回数据类型的问题。我有一个实现callable的
FOComp
类,'FOComp'的call()方法返回数据类型
List
,如下面的'FOComp'类的代码所示

方法“getResults()”返回类型为
ArrayList
的数据,如下面的代码所示。目前,在运行时,当我执行代码时,我收到以下错误:

这条线上有多个标记

  • 返回类型与
    Callable.call()不兼容
  • 返回类型与
    Callable.call()不兼容
请告诉我如何修理它

'FOComp'类

    static class FOComp implements Callable<List<Mat>> {//should return list contains 4 mats(0,45,90,135)

    private ArrayList<Mat> gaussianMatList = null;
    private List<ArrayList<Mat>> results_4OrientAngles_List = null;

    public FOComp(ArrayList<Mat> gaussianMatList) {
        // TODO Auto-generated constructor stub
        this.gaussianMatList = gaussianMatList;
        this.results_4OrientAngles_List = new ArrayList<ArrayList<Mat>>();
    }
    public List<ArrayList<Mat>> call() throws Exception {
        // TODO Auto-generated method stub
        try {
            featOrient = new FeatOrientation(this.gaussianMatList);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            featOrient.start();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        this.results_4OrientAngles_List.add(featOrient.getResults());

        return results_4OrientAngles_List;
    }
}
public ArrayList<Mat> getResults() {
    if (this.crossAddOrientMapsList != null) {
        if (!this.crossAddOrientMapsList.isEmpty()) {

            if (this.crossAddOrientMapsList.size() == 4) {
                double[] theta = new double[4];

                theta[0] = 0;
                theta[1] = 45;
                theta[2] = 90;
                theta[3] = 135;

                for (int i = 0; i < this.crossAddOrientMapsList.size(); i++) {
                    MatFactory.writeMat(FilePathUtils.newOutputPath("FinalCrossAdd_" + theta[i]+"_degs"), this.crossAddOrientMapsList.get(i));
                    //ImageUtils.showMat(this.crossAddOrientMapsList.get(i), "OrientMap_" + theta[i] + " degs");
                }

                return this.crossAddOrientMapsList;

            } else {

                Log.WTF(TAG, "getResults", "crossAddOrientMapsList != 4 !!");
                return null;
            }

        } else {
            Log.E(TAG, "getResults", "crossAddOrientMapsList is empty.");
            return null;
        }
    } else {
        Log.E(TAG, "getResults", "crossAddOrientMapsList is null");
        return null;
    }
}
静态类FOComp实现可调用{//应返回列表包含4个mats(0,45,90135)
私有ArrayList gaussianMatList=null;
私有列表结果\u 4OrientAngles\u List=null;
公共焦点列表(ArrayList gaussianMatList){
//TODO自动生成的构造函数存根
this.gaussianMatList=gaussianMatList;
this.results_4OrientAngles_List=new ArrayList();
}
公共列表调用()引发异常{
//TODO自动生成的方法存根
试一试{
featOrient=新FeatOrience(此.gaussianMatList);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(执行例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
试一试{
featOrient.start();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(执行例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
this.results_4OrientAngles_List.add(featOrient.getResults());
返回结果\u 4OrientAngles\u列表;
}
}
“获取结果”

    static class FOComp implements Callable<List<Mat>> {//should return list contains 4 mats(0,45,90,135)

    private ArrayList<Mat> gaussianMatList = null;
    private List<ArrayList<Mat>> results_4OrientAngles_List = null;

    public FOComp(ArrayList<Mat> gaussianMatList) {
        // TODO Auto-generated constructor stub
        this.gaussianMatList = gaussianMatList;
        this.results_4OrientAngles_List = new ArrayList<ArrayList<Mat>>();
    }
    public List<ArrayList<Mat>> call() throws Exception {
        // TODO Auto-generated method stub
        try {
            featOrient = new FeatOrientation(this.gaussianMatList);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            featOrient.start();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        this.results_4OrientAngles_List.add(featOrient.getResults());

        return results_4OrientAngles_List;
    }
}
public ArrayList<Mat> getResults() {
    if (this.crossAddOrientMapsList != null) {
        if (!this.crossAddOrientMapsList.isEmpty()) {

            if (this.crossAddOrientMapsList.size() == 4) {
                double[] theta = new double[4];

                theta[0] = 0;
                theta[1] = 45;
                theta[2] = 90;
                theta[3] = 135;

                for (int i = 0; i < this.crossAddOrientMapsList.size(); i++) {
                    MatFactory.writeMat(FilePathUtils.newOutputPath("FinalCrossAdd_" + theta[i]+"_degs"), this.crossAddOrientMapsList.get(i));
                    //ImageUtils.showMat(this.crossAddOrientMapsList.get(i), "OrientMap_" + theta[i] + " degs");
                }

                return this.crossAddOrientMapsList;

            } else {

                Log.WTF(TAG, "getResults", "crossAddOrientMapsList != 4 !!");
                return null;
            }

        } else {
            Log.E(TAG, "getResults", "crossAddOrientMapsList is empty.");
            return null;
        }
    } else {
        Log.E(TAG, "getResults", "crossAddOrientMapsList is null");
        return null;
    }
}
public ArrayList getResults(){
if(this.crossAddOrientMapsList!=null){
如果(!this.crossAddOrientMapsList.isEmpty()){
if(this.crossAddOrientMapsList.size()==4){
double[]θ=新的double[4];
θ[0]=0;
θ[1]=45;
θ[2]=90;
θ[3]=135;
对于(int i=0;i
另外,最好避免在方法签名中使用实现类,而是使用接口(在本例中,使用
List
而不是
ArrayList
)。这也将解决“多个标记”之一的问题:-)

干杯

另外,最好避免在方法签名中使用实现类,而是使用接口(在本例中,使用
List
而不是
ArrayList
)。这也将解决“多个标记”之一的问题:-)


干杯,

您的类声明说您将返回Mat列表(
FOComp实现可调用的
),但您的
调用
方法签名说您将返回Mat的ArrayList列表(
列表


你需要使它们保持一致

您的类声明说您将返回Mat的列表(
FOComp实现可调用的
),但是您的
调用
方法签名说您将返回Mat的数组列表(
List


你需要使它们保持一致

感谢您的回答,但我在您的回答中无法理解的是,您提到了避免在方法签名中实现类的问题!你能指出我在哪里这样做吗??抱歉误解您的意思。请确保:
public List call()引发异常{
再次感谢,但是你能告诉我如何使用接口来避免这种情况吗?首先,与你实现的
可调用的
相比,返回类型是错误的。其次,用
List
替换出现的例如
ArrayList
,你就可以走了。谢谢你的回答,但我不能理解你的意思r是,您提到的关于避免在方法签名中实现类的问题!请您指出我在哪里这样做?很抱歉误解了确保:
public List call()引发异常{
再次感谢,但是你能告诉我如何使用接口来避免这种情况吗?首先,与你实现的
可调用的
相比,返回类型是错误的。其次,用
列表
替换出现的例如
数组列表
,你就可以开始了。
@Override public List<Mat> call()