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



当我使用静态嵌套类时,我没有得到警告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 用于参数化(注意冗余(外部类的实例。 内部类绑定到实例,因此发出警告。相反,静态内部类不绑定到任何一个实例。静态意味着您的内部类将基本上独立于声明的任何实例。

最新更新