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

Dax*_*ado 9 java oop interface class instantiation

我曾多次听说过在实例化对象时你应该这样做:

"Interface"name = new"Class"();

例如,实现的类链表List:

List<String> name = new LinkedList<String>();
Run Code Online (Sandbox Code Playgroud)

LinkedList 实现了许多接口,包括queue,deque等.上面的代码和之间有什么区别

LinkedList<String> name = new LinkedList<String>();
Run Code Online (Sandbox Code Playgroud)

要么

Queue<String> name = new LinkedList<String>();
Run Code Online (Sandbox Code Playgroud)

为什么必须两次指定类型; 这似乎是多余的,但oracledocs似乎并未提及它.

Bir*_*irb 7

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

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

// Java 7 way:
List<String> name = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)

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