我正在使用OpenCV开发项目,并且有一个以List作为参数的函数。
Core.split(Mat m, List<Mat> mv);
我尝试在Java中查看List的文档,但是我对如何创建要使用的新列表感到困惑。我看到网上有人说这个列表只是一个界面,但我不确定这究竟是什么意思? (抱歉 - Java不是我的第一语言)
我在做的是 -
private List<Mat> mList;
private Mat listItem1; (etcetera)
mList.add(listItem1)
第一部分不会导致错误但是当我尝试mList.add(listItem1)
时会导致NULL指针异常。我假设这是因为我没有初始化List。我认为这将是mList = new List<Mat>();
的情况但是这给了我错误“无法实例化类型列表&lt; Mat&gt;”
非常感谢任何帮助 - 谢谢!对不起,如果这是一个愚蠢的问题。
答案 0 :(得分:2)
List
是一个界面。您需要使用List
的实现。试试ArrayList
。
mList = new ArrayList<Mat>();
检查JavaDoc for List是否有其他实现。
您无法实例化List
的原因是因为它是interface。它提供了一个合同,您可以放心,任何实施者都将定义其所有方法。这样,您就可以处理List
引用而无需了解其确切的实现。 (即ArrayList
,LinkedList
,Vector
等等......)
答案 1 :(得分:2)
正如您所说,List是一个接口,这意味着您无法初始化接口,只能使用实现该接口的类。例如ArrayList。
ArrayList实现List,其定义是:
public class ArrayList implements List<E>{
...
}
你可以这样做:
List<Mat> list = new ArrayList<Mat>();
Mat listItem ;
//code to initialize listItem properly
list.add(listItem );
答案 2 :(得分:1)
List
是一个界面。您需要new
一个实现List
接口的类。 ArrayList
就是一个例子:
List<Mat> mList = new ArrayList<Mat>();
答案 3 :(得分:1)
列表是一个界面。您需要使用List的实现,例如ArrayList
例如:
mList = new ArrayList()
答案 4 :(得分:1)
以下是将所有部分组合在一起的List示例:
// Here's a variation on your original fragment
// ArrayList is a perfectly reasonable type of List to use
private List<Mat> mList = new ArrayList<Mat>();
private Mat listItem1;
// (etcetera)
mList.add(listItem1);
// And here's an example of your call to split:
Core.split(listItem1, mList);
显然,以上是基于您原始问题的玩具示例。不过,这应该足以让你入门。
对于要使用的List
的特定类型,我通常建议人们从ArrayList
开始,除非确实需要使用其他内容。以下是Javadoc:
List接口的可调整大小的数组实现。实现所有 可选的列表操作,并允许所有元素,包括null。在 除了实现List接口之外,这个类还提供了 操作内部使用的数组大小的方法 存储清单。
因此,ArrayList
在实现List
接口的可调整大小的数据结构中提供了数组的大部分便利。