Java 嵌套类无法识别自身的实例



我正在尝试制作一个链表,但由于某种原因,Link<E>类没有"识别"(由于缺乏更好的词(自己的实例。更具体地说,VS代码告诉我:The method setnext(Problem<E>.Link<E>) is undefined for the type Problem<E>.Link<E>。我相信这意味着它将linkToAdd视为Problem<E>.Link<E>的实例,而将自己视为Link<E>的实例。但我可能是误解了。

谁能告诉我我做错了什么?

下面是仍然产生错误的类的最小化版本:


public class Problem<E>
{
public class Link<E>
{
private E element;
private Link<E> next;
Link(E element, Link<E> next) {
this.element = element;
this.next = next;
}
void setNext(Link<E> next) {
this.next = next;
}
}
private Link<E> start;
public Problem() {
start = new Link<E>(null, null);
}
public boolean add(E element) {
Link<E> linkToAdd = new Link<E>(element, null);
this.start.setnext(linkToAdd); 
}
}

编辑:我已经为问题类添加了构造函数。没有main(String[] args(,因为这是学校练习的一部分,我只得到一个类的文档,并期望基于此创建该类。我实际上还没有在任何地方使用这个类。

编辑#2:这是在终端中运行java Problem.java时给出的错误:

Problem.java:27: error: cannot find symbol
this.start.setnext(linkToAdd); 
^
symbol:   method setnext(Problem<E>.Link<E>)
location: variable start of type Problem<E>.Link<E>
where E is a type-variable:
E extends Object declared in class Problem
1 error
error: compilation failed

由于您没有提供客户端(驱动程序(代码,因此我假设您没有正确实例化链接。请参阅有效示例。

public class Problem<E> {
class Link<E> {
private E element;
private Link<E> next = null;
public Link(E element) {
this.element = element;
}
public void setnext(Link<E> next) {
this.next = next;
}
}
Link<E> start = new Link(null);
public void add(E element) {
Link<E> linkToAdd = new Link(element);
start.setnext(linkToAdd);
}
public static void main(String[] args) {
Problem<Integer> problem = new Problem<>();
Problem<Integer>.Link<Integer> link = problem.new Link<Integer>(1);
problem.add(2);
}
}

嵌套类无法识别,因为您需要先创建一个Problem类型的对象来实例化Link对象。您需要设置嵌套类static才能使Link<E> start = new Link(null)正常工作。

public class Bar {
public class Foo {
int a, b;
void doSomething() {
System.out.println(a + " " + b);
}
}
public static void main(String[] args) {
Bar bar = new Bar();
Foo foo = bar.new Foo();
}
}

这只是一个错别字:setNext(( 在Link<E>类定义中大写,但在我使用 setnext(( 的 add(( 方法中没有大写。

回想起来,这实际上是 vs code 一直试图告诉我的:

The method setnext(Problem<E>.Link<E>) is undefined for the type Problem<E>.Link<E>

然而,我对到处使用Link<E>感到困惑,并且似乎通过分享我对错误的错误解释而使我们其他人感到困惑。感谢大家的帮助!

最新更新