静态/非静态内部类:类型参数 T 隐藏类型 T

Joh*_*mbo 3 java generics inner-classes

当我使用静态嵌套类时,我没有收到警告The type parameter T is hiding the type T。但是,当我使用非静态嵌套类时,我收到警告。

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道,为什么当我使用静态嵌套类时没有收到此警告?

Sto*_*ica 5

内部类有对其包含类的引用。T通过该引用,内部类可以使用外部类中定义的值。例如,这样编译:

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

      public CustomNode(T data) {
        this.data = data;
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果创建内部类static,它就不能再使用T外部类中定义的内容,它将无法编译。

在您发布的代码中,T内部类的参数重新定义了T外部类的参数。这很令人困惑,因为读者可能认为这T在整个文件中意味着相同的事情,但事实并非如此。当在内部类中使用时,它会意味着其他的东西。

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

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

        public CustomNode(U data) {
            this.data = data;
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)