不兼容类型初始化Java中泛型类型的堆栈

时间:2018-06-29 11:59:59

标签: java generics compiler-errors java-8 stack

我正在尝试在Java上编写Stack结构。我的代码如下:

class Stack<T>{
  private static class Node<T>{
    private T data;
    private Node<T> next;

    public Node(T data){
      this.data = data;
    }
  }
  private Node<T> top;

  public Stack(){
    top = null;
  }
  public Stack(Node<T> top){
    this.top = top;
  }

  public static void main(String []args){
    Node<Integer> stackNode = new Node<Integer>(1);
    Stack<Node<Integer>> myStack = new Stack<Node<Integer>>(stackNode);
  }
}

在main方法中,我首先使用Integer 1初始化一个名为stackNode的节点,此方法有效。 然后,我尝试用stackNode作为顶部节点初始化Stack。这不起作用,当我编译时出现错误:

    Stack.java:56: error: incompatible types: Node<Integer> cannot be converted to Node<Node<Integer>>
        Stack<Node<Integer>> myStack = new Stack<Node<Integer>>(stackNode);
Note: Some messages have been simplified; recompile with
    -Xdiags:verbose to get full output 1 error

2 个答案:

答案 0 :(得分:5)

StackNode的类型应相同:

Node<Integer> stackNode = new Node<Integer>(1);
Stack<Integer> myStack = new Stack<Integer>(stackNode);

BTW,使用Java 7中引入的<>语法可以稍微清理一下代码:

Node<Integer> stackNode = new Node<>(1);
Stack<Integer> myStack = new Stack<>(stackNode);

答案 1 :(得分:3)

您使用Stack<Node<Integer>>Stack<T>组成T=Node<Integer>,但是在构造函数中您拥有Node<T>,因此它需要一个Node<Node<Integer>>并给出一个{ {1}}

您需要为两者都设置相同(为了清楚起见,可以使用Node<Integer>(钻石运算符):

<>