static/non-static 内部类:类型参数 T 隐藏了类型 T

static/non-static innerclass : The type parameter T is hiding the type T

当我使用 static 嵌套 class 时,我没有收到警告 The type parameter T is hiding the type T。但是,当我使用 non-static 嵌套 class 时,我收到了警告。

public class CustomStack<T> {
    private class CustomNode<T>{
        private T data;
        private CustomNode<T> next;

        public CustomNode(T data){
            this.data = data;
        }   

    }
}

我想知道,为什么我在使用 static 嵌套 class 时没有收到此警告?

内部 classes 引用了它们包含的 class。 通过该引用,内部 class 可以使用外部 class 中定义的值 T。 例如,这个编译:

  public class CustomStack<T> {
    private class CustomNode {
      private T data;
      private CustomNode next;

      public CustomNode(T data) {
        this.data = data;
      }
    }
  }

如果把内层class设为static,就不能再使用外层class中定义的T,编译不通过。

在您发布的代码中,内部 class 的 T 参数重新定义了外部 class 的 T。 这很令人困惑,因为 reader 可能认为 T 在整个文件中表示相同的内容,但事实并非如此。 当在内部 class 中使用时,它会有其他含义。

如果你想让内部 class 有自己的类型参数, 那么你必须以不同的方式称呼它,例如:

public class CustomStack<T> {
    private class CustomNode<U> {
        private U data;
        private CustomNode<U> next;

        public CustomNode(U data) {
            this.data = data;
        }   
    }
}

类型参数 T 用于参数化(注意冗余)外部 class 的实例。内部 classes 绑定到一个实例,因此出现警告。相反,静态内部 classes 不绑定到任何一个实例。静态意味着你的内部 class 将基本上独立于声明的任何实例。