当我使用静态嵌套类时,我没有得到警告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;
}
}
}
我想知道,为什么当我使用静态嵌套类时没有收到此警告?
内部类具有对其包含类的引用。 通过该引用,内部类可以使用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;
}
}
}
类型参数 T 用于参数化(注意冗余(外部类的实例。 内部类绑定到实例,因此发出警告。相反,静态内部类不绑定到任何一个实例。静态意味着您的内部类将基本上独立于声明的任何实例。