Viv*_*vin 6 java generics static
我正在编写一个堆栈,一个带有静态节点和其他非静态节点.
public class Stack<E> implements Iterable<E>
{
private int N;
private Node<E> first;
private static class Node<E> // This works fine.
{
private E item;
private Node<E> next;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使Node非静态时,它会给我这个警告"类型参数E隐藏了类型E"
public class Stack<E> implements Iterable<E>
{
private int N;
private Node<E> first;
private class Node<E> // This shows warning.
{
private E item;
private Node<E> next;
}
}
Run Code Online (Sandbox Code Playgroud)
我告诉我一点理解,因为静态memeber是类的成员所以它不会给我一个警告但是当我使它成为非静态时它属于实例.但这不是一个明确的想法.
cdh*_*wie 16
它警告您E在已定义范围时使用范围中的泛型参数名称.更改通用参数名称Node将是解决警告的一种方法:
public class Stack<E> implements Iterable<E>
{
private int N;
private Node<E> first;
private class Node<T>
{
private T item;
private Node<T> next;
}
}
Run Code Online (Sandbox Code Playgroud)
但由于E已经存在,你应该只使用它; Node由于在泛型类型中定义(Stack<object>.Node并且Stack<String>.Node是不同类型),因此已经是通用的:
public class Stack<E> implements Iterable<E>
{
private int N;
private Node first;
private class Node
{
private E item;
private Node next;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是有效的,因为Node它不是静态的,因此它具有对外部Stack<E>对象的引用,因此E必须定义它.如果Node是静态的,那么Stack<E>除了有效地在其词法范围内之外,它与外部类型没有真正的关系.