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