为什么不需要用通用内部 class 进行参数化?

Why don't need to parameterize with generic inner class?

尝试使用自定义链表编写自定义(但众所周知)堆栈通用实现。但算法不是重点。我的问题是,为什么不需要参数化

class Node<T>

以及声明

Node <T> top;  //pointer to next node

会不会多余?为什么?或者可能需要使用另一个字符,例如<U>?

public class Stack<T> {
        //T is the type parameter
        Node top; //topmost element of stack

        //defines each node of stack
        class Node{
           T value; //value of each node
           Node next;  //pointer to next node

           public Node(T value){
             this.value=value;  //initializing
             next=null;
           }
        }
        //This function pushes new element
        public void push(T value){
         Node current=new Node(value);
         if(isEmpty())
            top=current; //if empty stack
         else{
            current.next=top;
            top=current;
         }
        }
        //This function pops topmost element
        public T pop(){
         T value=null;
         if(!isEmpty()){
             top=top.next;
             value=top.value;
         }
         return value;  //returning popped value
        }

请注意,这里的 Node class 不是 static。这意味着 Stack 的每个 实例 都有自己的 Node class。与任何其他成员一样,它可以访问其封闭的 class' T.

如果您的节点 class 是它自己的顶级 class(在它自己的 .java 文件中),那么它将需要一个通用参数,因为您希望它具有.我建议你这样做。

但是,因为它是 Stack 的(非静态)内部 class,它可以访问 Stack 实例 中的所有内容,包括所有通用信息。

Will it be redundant?

是的。

Why?

由于 Node 被声明为 Stack 的内部 class,变量 TNode 的范围内,可以使用如所须。

Or may be need to use another character e.g. <U>?

如果您需要声明一个独特的类型变量,您可以这样做。 (事实上​​你可能应该使用不同的变量名。)它可能看起来像这样:

public class Stack<T> {

    Node<T> top;                               // CHANGE HERE

     class Node<U> {                           // CHANGE HERE
        U value;                               // CHANGE HERE
        Node<U> next;                          // CHANGE HERE

        public Node(U value) {                 // CHANGE HERE
            this.value = value;
            next = null;
        }
    }

    public void push(T value) {
        Node<T> current = new Node<>(value);   // CHANGE HERE
        if (isEmpty())
            top = current;
        else {
            current.next = top;
            top = current;
        }
    }

    public T pop() {
        T value = null;
        if (!isEmpty()) {
            top = top.next;
            value = top.value;
        }
        return value;
    }

这说明添加额外类型变量会产生更多代码,但不会提高可读性。