static / non-static innerclass:类型参数T隐藏类型T.

时间:2017-07-21 17:51:31

标签: 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;
        }   

    }
}

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

2 个答案:

答案 0 :(得分:3)

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

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

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

如果你创建内部类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;
        }   
    }
}

答案 1 :(得分:0)

类型参数T用于参数化(考虑冗余)外部类的实例。内部类绑定到实例,因此警告。对立的静态内部类,不受任何一个实例的约束。静态意味着你的内部类基本上与所声明的实例无关。