像这样多态地声明一个arrayList有什么区别:
List<Integer> iL = new ArrayList<Integer>();
和这样的正常风格:
ArrayList<String> stuff = new ArrayList<String>();
像这样多态地声明一个arrayList有什么区别:
List<Integer> iL = new ArrayList<Integer>();
和这样的正常风格:
ArrayList<String> stuff = new ArrayList<String>();
是,有一点不同
和
List<Integer> iL ;
你可以做
iL = new ArrayList<Integer>();
并且
iL = new LinkedList<Integer>();
好处:
您可以引用任何其他对象 List
另见
通常建议使用第一个声明。它允许轻松更改列表的实现,只需更改带有实例化的行。它还表明您没有使用ArrayList
.
使用该界面时会产生一些性能成本,但在现代虚拟机上几乎不会被注意到。
是的。在第二种情况下,stuff
只能是一个 ArrayList。首先,iL
可以是任何实现该List
接口的类的实例。
是的。它不仅仅是“编码风格”问题,其他答案正在谈论......
ArrayList
具有比List
接口提供的更多方法(例如trimToSize()
),因此将变量声明为 an 可以ArrayList
让您访问这些方法。
一般来说,除非您需要访问这些特殊方法,否则最好将其声明为 a List
,遵循声明抽象类优先于具体类的模式(允许您随意交换实现,例如使用 aLinkedList
代替)
你只能访问列表功能等。它是列表。
除了所有这些标准答案“接口程序”等,ArrayList
在你可以写List
的地方写简直丑陋,所以你最好有理由这样做——而且 99% 的时间不会可以。
在声明中使用接口时有一些区别:
LinkedList
或)。CopyOnWriteList
鉴于上述情况,使用接口声明方法参数和返回类型以隐藏不重要的实现细节并最大限度地减少限制。仅当性能非常关键或需要它提供的其他方法时,才使用实际类声明局部变量。如果您稍后选择不同的具体类,则需要更改对构造函数的调用,该调用可能与声明位于同一行。