(1) List<?> myList = new ArrayList<?>();

(2) ArrayList<?> myList = new ArrayList<?>();

我知道,对于(1),List接口的实现可以交换。似乎(1)通常在应用程序中使用,无论是否需要(我自己总是使用它)。

我想知道是否有人使用(2)?

此外,情况实际上需要使用(1)而不是(2)的频率是多少(请给我一个例子)(即(2)是不够的..除了编码到接口和最佳实践等)。


当前回答

List是一个接口。它没有方法。当你调用List引用上的方法时,它实际上在这两种情况下都调用了ArrayList的方法。

将来你可以将List obj = new ArrayList<>更改为List obj = new LinkList<>或其他实现List接口的类型。

其他回答

列表接口有几个不同的类——ArrayList和LinkedList。LinkedList用于创建索引集合,ArrayList用于创建排序列表。你可以在你的参数中使用它,但是你可以允许其他使用你的代码,库等的开发人员使用不同类型的列表,而不仅仅是你在这个方法中使用的

ArrayList<Object> myMethod (ArrayList<Object> input) {
   // body
}

你只能在ArrayList中使用它,而不是LinkedList,但是你可以允许在其他地方使用它的方法,这只是你的选择,所以使用接口可以允许它:

List<Object> myMethod (List<Object> input) {
   // body
}

在这个方法参数中,你可以使用任何你想使用的List类:

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

list.add ("string");

myMethod (list);

结论:

尽可能在任何地方使用接口,不要限制您或其他人使用他们想要使用的不同方法。

当你写List时,你实际上告诉,你的对象只实现了List接口,但你没有指定你的对象属于什么类。

在编写ArrayList时,指定对象类是一个可调整大小的数组。

因此,第一个版本使您的代码将来更加灵活。

看看Java文档:

类ArrayList——List接口的可调整大小的数组实现。

接口列表-一个有序的集合(也称为序列)。该接口的用户可以精确控制每个元素在列表中的插入位置。

数组—容器对象,保存固定数量的单一类型的值。

我认为使用(2)的人不知道利斯科夫替换原则或依赖反转原则。或者必须使用数组列表。

List是一个接口。它没有方法。当你调用List引用上的方法时,它实际上在这两种情况下都调用了ArrayList的方法。

将来你可以将List obj = new ArrayList<>更改为List obj = new LinkList<>或其他实现List接口的类型。

出以下两种:

(1) List<?> myList = new ArrayList<?>();
(2) ArrayList<?> myList = new ArrayList<?>();

第一种通常是首选。因为你将只使用List接口的方法,它为你提供了使用其他List实现的自由,例如未来的LinkedList。所以它将你与特定的实现分离。现在有两点值得一提:

我们应该始终按照接口编程。更多的在这里。 你几乎总是会使用数组列表而不是LinkedList。更多的在这里。

我想知道是否有人使用(2)

有时会(很少阅读)。当我们需要的方法是ArrayList实现的一部分而不是接口List的一部分时。例如ensureCapacity。

还有,这种情况发生的频率(以及我能得到一个例子吗) 实际上需要使用(1)而不是(2)

这是OOP中的一个经典设计模式,你总是试图将你的代码从特定的实现和程序解耦到接口。