【问题标题】:Java: When creating an object, why isn't the interface on the right hand side?Java:创建对象时,为什么界面不在右手边?
【发布时间】:2012-03-04 04:58:59
【问题描述】:
java.util.Queue<TreeNode> queue = new java.util.LinkedList<TreeNode>();

LinkedList 实现了队列。 Queue不应该在上面语句的右边,LinkedList在左边吗?

【问题讨论】:

  • 不,Queue是一个接口; LinkedList 是一个实现。
  • 为什么?你认为new Queue() 是什么意思?
  • Queue 是一种数据结构,允许将数据推送到一端并从另一端获取数据。有很多方法可以实现显示这种行为的结构:LinkedList 就是其中之一。
  • @trashgod 我是 Java 初学者。我知道 Queue 是一个接口,LinkedList 已经实现了它。实现接口的类创建对象对吗?所以,这就是为什么我认为 LinkedList 应该在另一边
  • 我可能会看到你的困惑。你可能会想'当我说“int i;”时我要求将 i 实现为 int;那么队列怎么可能在左边。但这还不是。左边是您需要的类型/行为。你分配给它的是具体的。因此,在您的情况下,“队列”需要看起来像队列;并且您正在为它分配(或使用它初始化)具体类型 LinkedList。

标签: java data-structures queue linked-list


【解决方案1】:

该示例将queue 声明为对具有Queue&lt;TreeNode&gt; 类型的对象的引用,但该变量必须引用该接口的具体实现的实例LinkedList&lt;TreeNode&gt;。通过coding to the interface,您同意仅使用Queue 的方法。这允许您在需要时更改实现,而无需更改 queue 的使用方式。

【讨论】:

    【解决方案2】:

    在 Java 中,您可以为相同类型或更通用类型的变量赋值。在您的示例中,new LinkedList&lt;TreeNode&gt;() 是一个值。由于LinkedList 实现 Queue,它比Queue 更具体。即一个LinkedList 是一个 Queue

    例如,这三个都是有效的

    Object o = new LinkedList<TreeNode>();
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    LinkedList<TreeNode> list = new LinkedList<TreeNode>();
    

    但是你不能写任何这些,因为它们是不正确的分配。

    LinkedList<TreeNode> o = new Object();
    LinkedList<TreeNode> queue = new Queue<TreeNode>();
    

    附:该示例中的第二个也是无效的,因为 Queue 是一个接口,并且您不能实例化 (new) 一个接口,因为它不是具体类型

    【讨论】:

    • 在你的第一行,你的意思不是更具体类型,而不是更通用类型吗?您可以将 Dog 对象(特定)分配给 Animal 变量(一般),但不能反过来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多