3

像这样多态地声明一个arrayList有什么区别:

List<Integer> iL = new ArrayList<Integer>();

和这样的正常风格:

ArrayList<String> stuff = new ArrayList<String>();
4

7 回答 7

4

是,有一点不同

List<Integer> iL ;

你可以做

iL = new ArrayList<Integer>();

并且

iL = new LinkedList<Integer>();

好处:

您可以引用任何其他对象 List


另见

于 2012-05-26T20:26:13.953 回答
3

通常建议使用第一个声明。它允许轻松更改列表的实现,只需更改带有实例化的行。它还表明您没有使用ArrayList.

使用该界面时会产生一些性能成本,但在现代虚拟机上几乎不会被注意到。

于 2012-05-26T20:27:13.360 回答
2

是的。在第二种情况下,stuff只能是一个 ArrayList。首先,iL可以是任何实现该List接口的类的实例。

于 2012-05-26T20:26:43.003 回答
1

是的。它不仅仅是“编码风格”问题,其他答案正在谈论......

ArrayList具有比List接口提供的更多方法(例如trimToSize()),因此将变量声明为 an 可以ArrayList让您访问这些方法。

一般来说,除非您需要访问这些特殊方法,否则最好将其声明为 a List,遵循声明抽象类优先于具体类的模式(允许您随意交换实现,例如使用 aLinkedList代替)

于 2012-05-26T20:27:57.497 回答
1

你只能访问列表功能等。它是列表。

于 2012-05-26T20:30:54.750 回答
1

除了所有这些标准答案“接口程序”等,ArrayList在你可以写List的地方写简直丑陋,所以你最好有理由这样做——而且 99% 的时间不会可以。

于 2012-05-26T20:30:57.210 回答
1

在声明中使用接口时有一些区别:

  • 表示最不重要的内容。如果您需要仅在具体子类中可用的特定方法,请将其声明为这样。
  • 允许您以最小的更改交换不同的实现(LinkedList或)。CopyOnWriteList
  • 由于多态性导致的微小性能损失。

鉴于上述情况,使用接口声明方法参数和返回类型以隐藏不重要的实现细节并最大限度地减少限制。仅当性能非常关键或需要它提供的其他方法时,才使用实际类声明局部变量。如果您稍后选择不同的具体类,则需要更改对构造函数的调用,该调用可能与声明位于同一行。

于 2012-05-26T20:35:47.053 回答