在一个关于队列的教程中,我看到了以下内容。
Queue<String> waitingQueue = new LinkedList<>();
为什么这句话在Java中是合法的?
我看到 什么叫 "按接口编程"? 但这并不能解释为什么上面的声明是有效的这个基本问题。如果Queue是一个接口,我怎么能把一个对象类型化到它上面?我只能在一个类中实现Queue接口来提供我需要的行为。
我错过了什么?
接口基本上是一个合同,说 "这些是任何实现这个接口的类必须实现的方法"。
用接口类型声明一个变量或字段,基本上是在说 "我不管这个变量或字段是什么 特定 类是被分配到这里的,只要它遵循合同。"
LinkedList
遵循合同规定的 Queue
通过实现所有必要的方法。
因此,我们可以将一个引用分配给类型为 LinkedList
类型的变量。Queue
.
开发者经常学习 "你不能实例化一个接口",这是对的,但略有误导。
你 可以 有一个对象是 一例 通过一个实现该接口的具体类的实例来实现一个接口类型。
所以虽然你不能执行 new Queue<String>()
(因为你不能实例化一个接口),表达式为 new LinkedList<String>()
实际上是返回一个 Queue<String>
(因为a LinkedList<String>
是一个 Queue<String>
同样,它 是一个 Object
).