Java 警告:类型参数E在使用内部类时隐藏类型E

Java 警告:类型参数E在使用内部类时隐藏类型E,java,generics,static,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

我在写一个堆栈,一个是静态节点,另一个是非静态节点

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;
    }
}
公共类堆栈实现Iterable
{
私人int N;
私有节点优先;
私有静态类节点//这工作正常。
{
私人电子物品;
私有节点下一步;
}
}
但是,当我试图使节点非静态时,它会给我以下警告:“类型参数E正在隐藏类型E”

公共类堆栈实现Iterable
{
私人int N;
私有节点优先;
私有类节点//显示警告。
{
私人电子物品;
私有节点下一步;
}
}

一点理解,我已经告诉我,由于静态memeber是类的成员,所以它不会给我警告,但当我将其设置为非静态时,它属于实例。但这不是一个清晰的想法

它警告您,您正在范围中使用已定义的通用参数名称
E
。更改
节点的通用参数名称将是解决警告的一种方法:

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
。如果
节点
是静态的,那么它与外部
堆栈
类型没有真正的关系,只是有效地处于其词法范围内。

谢谢您的回答。因此,当节点是静态的时,它不会向我显示该错误,因为它属于该类?它正确吗?您还可以详细说明为什么我不需要将节点设置为通用的吗?@Vwin我添加了一个解释。很好。谢谢:)为什么说“它没有真正的关系”@Vwin如果它是一个静态类,那么实例是独立的;如果不是静态类,则实例只能与外部类的实例建立关系。
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;
    }
}
public class Stack<E> implements Iterable<E>
{
    private int N;
    private Node first;

    private class Node
    {
        private E item;
        private Node next;
    }
}