如何在Java中使用List <t>?</t>

时间:2012-03-07 16:54:43

标签: java generics

我正在使用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;”

非常感谢任何帮助 - 谢谢!对不起,如果这是一个愚蠢的问题。

5 个答案:

答案 0 :(得分:2)

List是一个界面。您需要使用List的实现。试试ArrayList

mList = new ArrayList<Mat>();

检查JavaDoc for List是否有其他实现。

您无法实例化List的原因是因为它是interface。它提供了一个合同,您可以放心,任何实施者都将定义其所有方法。这样,您就可以处理List引用而无需了解其确切的实现。 (即ArrayListLinkedListVector等等......)

答案 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接口的可调整大小的数据结构中提供了数组的大部分便利。