无法实例化类型List<Product>

123

我有以下代码:

List<Product> product = new List<Product>();

错误信息:

Cannot instantiate the type List<Product>

Product是我EJB项目中的一个实体。为什么会出现这个错误?


21
很高兴收到这个问题。作为一名从C#转向Java的开发者,不太清楚在该语言中List是一个接口。 - SouthShoreAK
1
@SouthShoreAK 如果你阅读文档 :),就会知道这是真的。 - Matt Ball
15
在使用列表之前需要阅读文档,这只是糟糕设计的迹象。 - Krotton
5个回答

231

List 是一个接口。接口不能被实例化,只有具体的类型可以被实例化。你可能想使用一个 ArrayList,它是 List 接口的一种实现。

List<Product> products = new ArrayList<Product>();

21

使用具体的列表类型,例如ArrayList,而不是仅使用List


18

List是一个接口。最终你需要一个具体的类,因此尝试使用

List l = new ArrayList();
或者
List l = new LinkedList();

无论哪种都能满足您的需求。


我们可以两种方式都做,不是吗?我只是在回答问题,实际上是其中之一的答案。 - Mechkov
3
原始集合类型很危险,不应在针对Java 5+的任何新代码中使用或建议使用,就此结束。 - Matt Ball
应该避免使用,是的。那么对于预先生成的Java应用程序呢?底线是有两种实例化这种语句的方法,它们都是有效的。还有一个问题,无论何时都应该使用哪个。那就是泛型。 - Mechkov
1
@Matt Ball 好的,伙计,就让它结束吧。不过我们必须涵盖所有方面。问候! - Mechkov
无法完成。 它返回错误“泛型类缺少参数”。 - Abhilasha

10

任何实现接口的类都可以实例化List。这样,Java为我们提供了多态行为。请参见下面的示例:

List<String> list = new ArrayList<String>();

我使用List来引用ArrayList对象,而不是直接实例化一个ArrayList,这样我们就只使用List接口方法,不关心其实际实现。

实现List接口的类的示例包括ArrayList、LinkedList、Vector。根据需要创建相应的List。

例如:当你需要进行多次插入或删除时,LinkedList更有用。由于ArrayList由固定大小的数组支持,并且必须通过移动或重新增长数组来更改数组内容,因此它更加消耗性能。

同样,使用List,我们可以简单地更改对象实例化,而无需在程序中进一步更改任何代码。

假设我们正在使用ArrayList<String> value = new ArrayList<String>();

我们可能会使用ArrayList的特定方法,而代码将不够健壮。

通过使用List<String> value = new ArrayList<String>();

我们确保只使用List接口方法...如果我们想将其更改为LinkedList,我们只需更改代码:

List<String> value = new ArrayList<String>(); 

------ 你的代码使用了List接口方法.....

value = new LinkedList<String>(); 

-----你的代码仍然使用List接口方法,我们不需要改变任何东西----- 而且我们在代码中也不需要进一步更改

顺便说一下,LinkedList也可以作为一个Deque工作,显然你也不能直接实例化它,因为它也是一个接口


1
这被称为“面向接口编程”设计模式。 - Downhillski

2

接口不能直接实例化,您应该实例化实现此接口的类。

尝试这样做:

NameValuePair[] params = new BasicNameValuePair[] {
        new BasicNameValuePair("param1", param1),
        new BasicNameValuePair("param2", param2),
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接