【问题标题】:How to Create a Linked List with Generics如何使用泛型创建链接列表
【发布时间】:2017-02-11 15:03:54
【问题描述】:

我正在尝试使用泛型在 Java 中编写我自己的 Linked List 类。链表应该适用于我创建的两个不同的节点类。我希望能够调用链接列表中使用的节点类的方法,但显然它不像我尝试的那样工作。每个节点类将具有所有相同的方法(和方法名称),但每个节点的方法将做不同的事情。对此我有几个问题:

1) 在泛型类型变量上调用方法的“解决方法”(如果有的话)是什么。就我而言,我试图从我的链表类中调用我的节点类的方法。

2) 如何确保我的 Linked List 可以拥有的两种数据类型是我定义的两个节点类?

3) 我认为这完全错误吗?即我应该以完全不同的方式来做这件事吗?

这是代码的简化版本。

public class Node1 {

    public int stuff1;
    public Node1 nextNode;

    Node1() {
        this.nextNode = null;
    }

    public void doStuff(){
        System.out.println("Node 1 did stuff");
    }

}

public class Node2 {

    public int stuff2;
    public Node2 nextNode;

    Node2() {
        this.nextNode = null;
    }

    public void doStuff(){
        System.out.println("Node 2 did other stuff");
    }

}

public class LinkedList<T>{

    public T first; // do I need to construct/instantiate this too?

    public void doStuff() {
        first.doStuff;
    }

    public static void main(String[] args){
        LinkedList<Node1> node1 = new LinkedList<Node1>;
        LinkedList<Node2> node2 = new LinkedList<Node2>;
        node1.doStuff();
        node2.doStuff();
    }

}

谢谢!

【问题讨论】:

  • 你需要让 node1 和 node2 扩展一个公共抽象类,这样你就可以只接受这个类,比如T extends abstractClass
  • 只是一个想法(如果不适合您的目的,请丢弃):您可以拥有一个抽象的Node 类,其中包含Node 需要的所有内容,只有doStuff 方法是抽象的,具有不同的具体子类Node1Node2 中的实现。您的列表类可以声明为public class LinkedList&lt;T extends Node&gt;

标签: java generics linked-list


【解决方案1】:

对于您的具体示例:

  1. 定义一个interface指定doStuff(),例如调用它CanDoStuff
  2. 让两个类都实现接口
  3. LinkedList 类定义为LinkedList&lt;T extends CanDoStuff&gt;

但是,如果您想定义仅包含 Node1 元素和/或 LinkedList&lt;Node2&gt;LinkedList&lt;Node1&gt;,则使用泛型更适用。如果您真的想将列表内容永远限制为这两个类,则根本不需要使用泛型。在 LinkedLIst 替换 CanDoStuff 中有 T 的地方(并使类非泛型)。

在这种情况下,当您从列表中检索元素时,它们会以 CanDoStuff 的形式返回,如果您想调用特定于某个具体类的方法,则需要向下转换引用,除非您可以移动将方法声明到CanDoStuff 并在Node1Node2 中实现它。

【讨论】:

  • "你在 LinkedLIst 中有 T 的地方替换 CanDoStuff (并使类非泛型)。"这是否意味着将链表类的第一行设为:public class LinkedList {,而所有其他使用“T”的地方都替换为 CanDoStuff?
  • 是的,我就是这个意思。
猜你喜欢
  • 2022-07-18
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 2018-11-08
相关资源
最近更新 更多