当我使用静态嵌套类时,我没有收到警告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;
}
}
}
我想知道,为什么当我使用静态嵌套类时,我不会收到此警告?
答案 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用于参数化(考虑冗余)外部类的实例。内部类绑定到实例,因此警告。对立的静态内部类,不受任何一个实例的约束。静态意味着你的内部类基本上与所声明的实例无关。