我正在编写一个堆栈,一个带有静态节点和其他非静态节点。
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;
}
}
但是当我尝试使Node非静态时,它会给我这个警告&#34;类型参数E隐藏了类型E&#34;
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;
}
}
我告诉我一点理解,因为静态memeber是类的成员所以它不会给我一个警告但是当我使它成为非静态时它属于实例。但这不是一个明确的想法。
答案 0 :(得分:15)
它警告您在定义范围时使用范围中的通用参数名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;
}
}
但由于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;
}
}
请注意,这是有效的,因为Node
不是静态的,因此它引用了外部Stack<E>
对象,因此必须定义E
。如果Node
是静态的,那么它与外部Stack<E>
类型没有实际关系,除了实际上在其词法范围内。