通常我们使用代码来进行接口:
List<String> list = new ArrayList<String>();
我们可以这样写吗?
AbstractList<String> list = new ArrayList<String>();
这种初始化方式有什么缺点?欢迎提供任何见解。
通常我们使用代码来进行接口:
List<String> list = new ArrayList<String>();
AbstractList<String> list = new ArrayList<String>();
AbstractList
会将你的实现与AbstractList
的子类绑定在一起,而使用List
接口允许你将任意实现该接口的实现分配给list
变量。AbstractList
也将使你可以访问AbstractList
的方法(无需进行强制类型转换),这些方法不是List
接口的一部分,但使用它们会使你的代码变得不够灵活。ArrayList<String> list = new ArrayList<String>();
然而,如果您有一个公共字段或方法参数,最好使用最少特定声明:接口。抽象类也实现了接口,因此可以使用它。但是您的类的消费者随后可以使用实现接口的任何类,而该类可以继承任何其他他们可能喜欢的类。
List<String>
而不是 AbstractList<String>
的优点在于,List
指定了一个合同,而 AbstractList
指定了(部分)实现。使用 List
确保您的代码与任何 List
的实现兼容,而不仅仅是从 AbstractList
派生的实现。使用AbstractList
的一个缺点是,您限制了自己只能使用扩展AbstractList
的列表类。实现List
接口而不将AbstractList
作为超类是完全可能的。
第二个缺点是这样不会编译:
List<String> list = new ArrayList<String>();
AbstractList<String> list2 = list;
List<String>
都是一个AbstractList<String>
。