【问题标题】:static/non-static innerclass : The type parameter T is hiding the type T静态/非静态内部类:类型参数 T 隐藏了类型 T
【发布时间】:2017-12-27 20:53:42
【问题描述】:

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

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

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

    }
}

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

【问题讨论】:

    标签: java generics inner-classes


    【解决方案1】:

    内部类具有对其包含类的引用。 通过该引用,内部类可以使用外部类中定义的值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;
            }   
        }
    }
    

    【讨论】:

    • 绝妙的答案!这值得更多的支持!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      相关资源
      最近更新 更多