关于java:使用Collection接口创建ArrayList对象的多态性有什么好处?

What is the benefit of polymorphism using Collection interface to create ArrayList object?

我研究了多态性并理解它可以像下面这样做动态方法绑定。

假设类动物是抽象类。

1
2
3
4
5
6
7
8
9
10
11
public class AnimalReference
{
  public static void main(String args[])
  Animal ref                 // set up var for an Animal
  Cow aCow = new Cow("Bossy"); // makes specific objects
  Dog aDog = new Dog("Rover");

  // now reference each as an Animal
  ref = aCow; ref.speak();
  ref = aDog; ref.speak();
}

我曾经创建过arraylist实例,比如:

1
ArrayList myList = new ArrayList();

但通常我认为人们会写:

1
Collection myList = new ArrayList();

所以我的困惑是,将其声明为集合有什么好处?另外,我不知道在"mylist"前面可以有"collection"(接口而不是抽象类)。

为什么说:

1
ArrayList myList = new ArrayList();

我阅读收集接口和ARAYLIST Java文档以及在线教程,但仍然不是很清楚。有人能给我解释一下吗?


如果你declare myListAS ArrayList你修复的混凝土,其类型。每个人都会使用它,这是depend型混凝土,和它是容易的(甚至inadvertently)的呼叫的方法,这是ArrayList的特异性。如果你决定去意大利了sometime后到它的变化,例如LinkedListCopyOnWriteArrayList,你需要重新编译和夏娃的可能变化的客户端代码。编程接口的方法eliminates这个风险。 </P >

值得注意的是CollectionArrayList之间,有另一个水平的一种抽象的概念:List接口。typically的使用模式的一个清单是非常不同的,从这一个LSP,集或队列。这么一型收集你需要的工作通常是早期的决心,是不会改变的。你的declaring变为一List让这清澈的决策,给其客户的和有用的信息的收集,对本合同的obeys。。。。。。。Collectionotoh是通常不甚为有用的方法进行迭代,通其以上的元素。 </P >


它的probably更普通的写 List myList = new ArrayList();丹瑞的使用Collection。。。。。。。通常的某些方面有一个列表,它是重大的。在vagueness大学Collection方面的接受与重复的元素是否是一个集或列表(或任何underneath)可以是一个痛苦的。 </P >

这aside,原是用一种抽象的概念,或实施的独立性。做我真的关心,如果我有列表是一个ArrayListVector???????probably不是很多的时间。我的代码是更灵活的,如果它使用的最通用的接口,expresses面向什么我需要做的。 </P >

"我们是简单的比方,你写的程序,采用全ArrayLists,然后以后的IT需求,支持多用户线程安全方法,所以你想改变你的全ArrayLists到Vectors。如果你已经已经通过全面的证明人的ArrayList型的,你要改变的是,每一个使用。如果你已经被通过全面的证明人的List只读型的,你要改变的地方,在你创建它们。 </P >

也,有时在执行级的东西可能不会是你想要能或进出使用。例如,当使用一种持续性hibernate provider类,这类实际的Setimplements接口可以是一个高度专业化的自定义实现独特的框架,或它可能在HashSet平原,depending是如何面向有创新。你不在乎?差分法,它是一种Set给你。 </P >


如果你是一declaring ArrayList,我不能永远使用ArrayList为型的左侧。代替,程序的界面,它是ListCollection。。。。。。。 </P >

值得注意的是,如果你declare的一种方法是以一种Collection,它可以通过一个或ListSet。。。。。。。 </P >

作为一种债券的音符,考虑使用泛型。 </P >

编辑:有说是仿制药,也introduces一些陷阱。 </P >

List不安ArrayList商店,但不安ArrayList。。。。。。。你会需要List到商店的ArrayList。。。。。。。 </P >


好吧,数组列表有一个动态大小。集合没有编译时检查,它必须是强制类型化的。集合只包含引用的对象。你可以把收藏看作是一个"包"。并且可以对整个对象执行操作。我还确信,与数组列表相比,集合的搜索时间很短,但不是正的。arraylist有更多的功能和方法可以调用。


在局部变量声明中使用的类型(如在ArrayList中)例)通常不那么重要。你要确保的就是MyList的类型(名称"MyList"左侧的单词)具有比任何接受MyList.

考虑:

1
2
3
4
5
6
7
ArrayList words = new ArrayList();
sort(words);
removeNames(words);

public void sort(Collection c)  ... blah blah blah

public void removeNames(List words) ...

我本来可以把"单词"的类型改成列表。它不对程序的可读性或行为有任何区别。但我不能把"单词"定义为宾语。这太笼统了。

在相关注释中,定义公共方法时,应仔细考虑方法参数的类型,因为这对呼叫者可以传递的内容有直接影响。如果我定义分类不同:

1
2
3
4
5
6
ArrayList words = new ArrayList();

// this line will cause a compilation error.
sort(words);

public void sort(LinkedList c)  ... blah blah blah

分类的定义现在非常严格。在第一个例子中,sort方法允许任何对象作为参数,只要它实现集合。在第二个示例中,sort只允许LinkedList,它将不接受任何其他内容(arraylist、hashset,Treesets和许多其他)。排序方法可以使用现在相当有限。这可能是有充分理由的;Sort的实现可能依赖于LinkedList的特性数据结构。如果人们使用此代码需要一个排序算法,该算法适用于除链接列表。

编写Java库的主要技巧之一是决定类型。方法参数。你想成为什么样的将军?


首先,继承和接口之间存在显著差异。一个简短的回溯历史:在普通的C++中,你可以从多个类继承。如果一个"transformer"类继承自"vehicle"和"human",这会产生负面影响,这两个类都实现了一个名为"moveforward"的方法。如果在"Transformer"类上调用此方法,实例应该使用哪个函数?"人"还是"车"的实施?为了解决这个问题,接口由Java,C….Interfaces是类与其他对象之间的契约。您对功能作出了承诺,但契约没有为您的类实现任何逻辑(以防止transformer.moveforward"问题)。

多态性通常意味着某些东西可以以不同的方式出现。"变压器"可以是"车辆"和"人"。根据您的语言(我使用C),您可以根据您想要履行的合同实施不同的"前进"行为。

使用接口而不是具体的实现有几个优点。首先,您可以在不更改代码的情况下切换实现(GoogleLookup;的依赖项注入)。其次,您可以使用测试框架和模拟框架更容易地测试代码。第三,使用最通用的接口数据交换(如果只想在值上进行交互,则使用列表的枚举器instad)是一个很好的实践。

希望这有助于理解接口的优点。


通过declaring和使用myList为一集,你是隐藏的实现选择你是制作(在这个案例中,那它是represented作为一个ArrayList)。在一般情况下,这意味这的任何事情,这是你的depend工件(代码将是只读的rely mylist behaving作为一个集合,而不是作为一个ArrayList中特有的。如果你决定去意大利了,通到代表它就为我们以后的是(A组吗?(一)联列表吗?用什么理由,你不喜欢什么其他的。 </P >


Collection是一个类别的ArrayList大学。如果你只需要在功能性提供由Collection,它的良好做法,因为你是explicitly显示什么是功能性,你需要在变量的宣言。那是你的选择ArrayList安在initialization irrelevant(虽然是一个好的默认选择);因此,它是一个Collectiontells你和任何未来的编码器exactly什么合同关于你的关怀。 </P >