0
List<Kevin> kevin = new ArrayList<Kevin>();

我有一个 Kevin 类型的对象列表,现在它对我传递给我的方法有什么影响吗?

void method1(List<Kevin>)

void method2(ArrayList<Kevin>)

似乎两者都在工作,除了我可以访问method1之外还有什么区别,我只是不确定我们是否需要发送对象。List interface related methodsarray list related methods on method2.ListArrayList

4

4 回答 4

3

它们的行为方式相同。通常最好在可能的情况下对接口进行编码,因此更喜欢 List<Kevin>(或者即使Iterable<Kevin>您只需要遍历集合)。如果你的方法只有在它是ArrayList<Kevin>一个ArrayList.

于 2013-05-03T19:39:19.040 回答
2

method1 也适用于 List 的其他实现(例如 LinkedList),而 method2 更严格,只接受一个实现。通常,出于可重用性的原因,尽量使您的方法参数尽可能通用。

于 2013-05-03T19:40:00.923 回答
2

在大多数情况下,这实际上并不重要。ArrayListIS aList所以你从 a 获得的任何功能也List将从ArrayList. 而且我应该注意,对于同一主体,您实际上可能没有得到一个继承自的ArrayList子类,而是继承自的某个子类ArrayList(就像您说的那样List)。

也就是说,通常认为最佳实践是要求您需要最通用的类​​型。因此,如果您只需要List提供的方法,则传递一个List对象,但是,如果ArrayList您需要特定的东西,则传递它。

于 2013-05-03T19:40:26.057 回答
1

传递一个 ArrayList 会阻止你(或者至少,使它更难)改变你的想法并在List以后使用另一种,因为method2()它将依赖于 list 是 type ArrayList,而不是 simple List

您可能想要传递的其他 List 实现包括LinkedList, CopyOnWriteArrayList, Arrays.asList(), Collections.synchronizedList(), 或者,通常,Collections.unmodifiableList()

因此,最佳实践是在接口上编程,并传递一个List(甚至是一个Collection或者Iterable如果调用方法不应该假设它是一个列表)。

对于同一个类中的私有方法,这并不重要。但是,如果该方法是公共 API 的一部分,那么传递 ArrayList 有时会真的对您造成伤害。

于 2013-05-03T19:43:18.523 回答