static/non-static 内部类:类型参数 T 隐藏了类型 T
static/non-static innerclass : The type parameter T is hiding the type T
当我使用 static 嵌套 class 时,我没有收到警告 The type parameter T is hiding the type T
。但是,当我使用 non-static 嵌套 class 时,我收到了警告。
public class CustomStack<T> {
private class CustomNode<T>{
private T data;
private CustomNode<T> next;
public CustomNode(T data){
this.data = data;
}
}
}
我想知道,为什么我在使用 static 嵌套 class 时没有收到此警告?
内部 classes 引用了它们包含的 class。
通过该引用,内部 class 可以使用外部 class 中定义的值 T
。
例如,这个编译:
public class CustomStack<T> {
private class CustomNode {
private T data;
private CustomNode next;
public CustomNode(T data) {
this.data = data;
}
}
}
如果把内层class设为static
,就不能再使用外层class中定义的T
,编译不通过。
在您发布的代码中,内部 class 的 T
参数重新定义了外部 class 的 T
。
这很令人困惑,因为 reader 可能认为 T
在整个文件中表示相同的内容,但事实并非如此。
当在内部 class 中使用时,它会有其他含义。
如果你想让内部 class 有自己的类型参数,
那么你必须以不同的方式称呼它,例如:
public class CustomStack<T> {
private class CustomNode<U> {
private U data;
private CustomNode<U> next;
public CustomNode(U data) {
this.data = data;
}
}
}
类型参数 T 用于参数化(注意冗余)外部 class 的实例。内部 classes 绑定到一个实例,因此出现警告。相反,静态内部 classes 不绑定到任何一个实例。静态意味着你的内部 class 将基本上独立于声明的任何实例。
当我使用 static 嵌套 class 时,我没有收到警告 The type parameter T is hiding the type T
。但是,当我使用 non-static 嵌套 class 时,我收到了警告。
public class CustomStack<T> {
private class CustomNode<T>{
private T data;
private CustomNode<T> next;
public CustomNode(T data){
this.data = data;
}
}
}
我想知道,为什么我在使用 static 嵌套 class 时没有收到此警告?
内部 classes 引用了它们包含的 class。
通过该引用,内部 class 可以使用外部 class 中定义的值 T
。
例如,这个编译:
public class CustomStack<T> {
private class CustomNode {
private T data;
private CustomNode next;
public CustomNode(T data) {
this.data = data;
}
}
}
如果把内层class设为static
,就不能再使用外层class中定义的T
,编译不通过。
在您发布的代码中,内部 class 的 T
参数重新定义了外部 class 的 T
。
这很令人困惑,因为 reader 可能认为 T
在整个文件中表示相同的内容,但事实并非如此。
当在内部 class 中使用时,它会有其他含义。
如果你想让内部 class 有自己的类型参数, 那么你必须以不同的方式称呼它,例如:
public class CustomStack<T> {
private class CustomNode<U> {
private U data;
private CustomNode<U> next;
public CustomNode(U data) {
this.data = data;
}
}
}
类型参数 T 用于参数化(注意冗余)外部 class 的实例。内部 classes 绑定到一个实例,因此出现警告。相反,静态内部 classes 不绑定到任何一个实例。静态意味着你的内部 class 将基本上独立于声明的任何实例。