List<Kevin> kevin = new ArrayList<Kevin>();
我有一个Kevin类型的对象列表,现在它对我传递给我的方法有什么不同吗?
void method1(List<Kevin>)
void method2(ArrayList<Kevin>)
似乎两者都有效,除了我可以访问method1和List interface related methods
上的array list related methods on method2.
之外,还有差异我只是不确定是否需要发送List
或ArrayList
个对象。
答案 0 :(得分:3)
他们的行为都是一样的。通常最好在可能的情况下对接口进行编码,因此更喜欢 List<Kevin>
(如果只是需要遍历集合,则甚至是Iterable<Kevin>
)。如果你的方法只有ArrayList<Kevin>
才能正常运作,那就足够了......但除此之外,最好不要限制调用者强制他们传入ArrayList
。
答案 1 :(得分:2)
method1也适用于List的其他实现(例如LinkedList),而method2更严格,只接受一个实现。通常,出于可重用性原因,尽量使方法参数尽可能通用。
答案 2 :(得分:2)
在大多数情况下,它实际上并不重要。 ArrayList
是List
,因此您从List
获得的任何功能都来自ArrayList
。我应该注意到,在同一个主体中,你可能实际上并没有得到ArrayList
而是从ArrayList
继承的某个子类(就像你说List
一样)。
也就是说,通常认为最佳做法是要求您需要的通用类型。因此,如果您只需要List
提供的方法,则传递List
对象,但是,如果您需要ArrayList
特定的内容,则传递该对象。
答案 3 :(得分:1)
传递一个ArrayList会阻止你(或至少使其变得更加困难)改变主意并在以后使用另一种List
,因为method2()
依赖于列表类型ArrayList
,而不仅仅是List
。
您可能希望传递的其他List实现包括LinkedList
,CopyOnWriteArrayList
,Arrays.asList()
,Collections.synchronizedList()
,或者Collections.unmodifiableList()
。< / p>
因此,最佳做法是在接口上进行编程,如果调用方法甚至不应假设它是List,则传递List
(甚至是Collection
或Iterable
。
对于同一个类中的私有方法,它并不重要。但是如果该方法是公共API的一部分,那么传递一个ArrayList可能会在某个时候伤害到你。