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

Java nested class does not recognize instance of itself

我正在尝试创建一个链表,但由于某些原因,Link<E> class 并不是 'recognize'(缺少更好的词)自身的一个实例。更具体地说,VS 代码告诉我:The method setnext(Problem<E>.Link<E>) is undefined for the type Problem<E>.Link<E>。我相信这意味着它将 linkToAdd 视为 Problem<E>.Link<E> 的一个实例,并将其自身视为 Link<E> 的一个实例。但我可能误会了。

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

这里是仍然会产生错误的 class 的最小化版本:


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); 
    }
}

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

编辑 #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

无法识别嵌套的 class,因为您需要先创建一个 Problem 类型的对象来实例化 Link 对象。您需要设置嵌套 class 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();
 }
}

由于您没有提供客户端(驱动程序)代码,我假设您没有正确实例化 Link。请查看有效示例。

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);
        }
    }

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

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

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

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