【问题标题】: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 用于参数化(注意冗余)外部类的实例。内部类绑定到一个实例,因此发出警告。相反,静态内部类不绑定到任何一个实例。静态意味着您的内部类将基本上独立于声明的任何实例。