如何使用泛型创建链接列表

时间:2017-02-11 06:44:54

标签: java generics linked-list

我正在尝试使用泛型在Java中编写自己的Linked List类。链表应该与我创建的两个不同的Node类一起使用。我希望能够调用我的链接列表中使用的节点类的方法,但显然它不能像我尝试的那样工作。每个节点类都将具有所有相同的方法(和方法名称),但每种节点的方法将执行不同的操作。有了这个,我有几个问题:

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

2)如何确保链接列表中只有两种数据类型是我定义的两个节点类?

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();
    }

}

谢谢!

1 个答案:

答案 0 :(得分:1)

对于您的具体示例:

  1. 定义interface指定doStuff(),将其称为CanDoStuff
  2. 让两个类都实现接口
  3. LinkedList类定义为LinkedList<T extends CanDoStuff>
  4. 但是,如果要定义仅包含LinkedList<Node1>元素和/或Node1的{​​{1}},则使用泛型会应用更多内容。如果你真的想限制列表内容永远只有那两个类,你根本不需要使用泛型。您LinkedList<Node2>替换TLinkedLIst的位置(并使该类非通用)。

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