当前位置: 首页 > 面试题库 >

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

卞琨
2023-03-14
问题内容

我正在写一个堆栈,其中一个带有静态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;
    }
}

但是,当我尝试使节点变为非静态时,它会发出以下警告:“类型参数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;
    }
}

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


问题答案:

这是警告您,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>除了有效地处于其词法范围之内之外,它与外部类型没有任何实际关系。



 类似资料:
  • 问题内容: 我在Eclipse(最新版本)中收到以下代码的警告。 该警告出现在“ A”中的“ T”处,并显示:“类型参数T隐藏了类型T”。 奇怪的是,以下代码不生成任何错误或警告。 但是现在我不能在告诉它T是什么类型的同时扩展A了。 我完全感到困惑。有人知道为什么会这样吗?谢谢。 问题答案: 您是否在某个地方有一个名为的类或接口,或者您在某个地方将其用作具体的类型名称,而不是用作类型参数(这意味着

  • 问题内容: 我正在定义一个类: 编译器抱怨被隐藏。我猜第二次出现在定义中是第一次隐藏在范围内,好像可以将变量分配给两种不同的类型一样。如何正确做? 编辑: 这是一个内部阶级。完整的代码可以是: 现在的问题是,如果我重新提名内部人,我不确定那是和实际上是相同的类型。 问题答案: 不要将内部类参数化: 作为声明中定义的内部(非静态嵌套)类,仍将具有in的含义,因为每个类都对其外部实例具有隐式引用。

  • 问题内容: 此代码似乎正常工作 方法类型参数是否会遮盖类类型参数? 另外,在创建对象时,它是否使用类的type参数? 例 在它们 不冲突 的情况下,这通常适用于类的类型参数 吗? 我的意思是,当只有类具有类型参数而不是构造函数时,还是在构造函数中查找类型参数?如果他们 确实发生冲突 ,这将如何改变? 请参阅下面的讨论 如果我有一个函数调用 问题答案: 您所有的都不同,但是只有使用完整的语法调用方法

  • 我试图理解为什么当我在MyModel中为T使用更高类型的参数时,以下代码无法编译 但是如果我把它改成< code > new Bar[my model[Any]]它就会编译。这是为什么呢?

  • 问题内容: 为了保存一个由一个成员完成的付款的ArrayList,我想将“付款列表ID”更改为一个字符串,因此我创建了以下方法: 但是我收到以下警告: 谁能解释我为什么? 问题答案: 您绝对应该阅读有关Java泛型的本教程 :http : //docs.oracle.com/javase/tutorial/java/generics/ 简而言之: 许多Java类和类型(称为 泛型类 或 泛型类型

  • 我正在获得我想要的输出,但不知道如何摆脱这些警告。任何帮助是值得赞赏的。 警告: > < li> Format指定类型“void *”,但该参数的类型为“char”[-w Format]printf(" \ n指针变量的值为%p\n ",* myString); " Format指定类型为' void * ',但该参数的类型为' char' [-Wformat] printf("%p\n ",my