为什么要将对象分配给接口?

2022-09-04 20:39:40

我听过好几次,在实例化对象时,你应该这样做:

“接口”名称 = 新的“类”();

例如,对于实现的类链接列表:List

List<String> name = new LinkedList<String>();

LinkedList实现许多接口,包括队列、deque 等。上述代码与

LinkedList<String> name = new LinkedList<String>();

Queue<String> name = new LinkedList<String>();

为什么还必须指定两次类型;这似乎是多余的,但预言家似乎没有提到它。


答案 1

LinkedList<String> name = new LinkedList<String>();在 Java 7 中是多余的。可以将其重写为 。LinkedList<String> name = new LinkedList<>();

你想写类似的东西的原因:

// Java 7 way:
List<String> name = new LinkedList<>();

是为您提供以后更改数据收集的自由,如果您改变主意。通过这种方式,您的代码更加灵活。关于这一点,您应该注意的是,您能够使用的方法仅限于左侧类型(在本例中)。这意味着,如果您使用层次结构中较高的类型(就是极端示例),则可能无法获得所需的所有功能。ListObject


答案 2
LinkedList<String> name = new LinkedList<>();

将公开 在 中定义的方法及其超类。LinkedList

Queue<String> name = new LinkedList<>();

将公开 在其中定义的方法及其扩展的接口。Queue

您应该将对象定义为一个类/接口,该类/接口包含您需要的所有内容(方法,变量等),同时还要使其尽可能抽象。

例如,这隐藏了实现细节,并允许在实现之间更轻松地切换。

请注意,由于菱形运算符,您不必在初始化中指定类型。