Java枚举找不到符号错误

Java枚举找不到符号错误,java,Java,我最近遇到了这个错误,花了我很长时间才弄明白 我想我应该把它贴在这里,以防其他人也会碰到它,尽管这种可能性可能非常低(见下文) 我最近开始在Java中使用enum,如下所示 public enum State { ON, OFF } 然后,在我的对象(从线程扩展而来)中,有一个称为state的变量: public class Example extends Thread { private State state; public Example() { state =

我最近遇到了这个错误,花了我很长时间才弄明白

我想我应该把它贴在这里,以防其他人也会碰到它,尽管这种可能性可能非常低(见下文)

我最近开始在Java中使用enum,如下所示

public enum State {
    ON, OFF
}
然后,在我的对象(从
线程扩展而来)中,有一个称为state的变量:

public class Example extends Thread {
    private State state;
    public Example() { state = State.OFF; } // initialize object at OFF state
但是,这将在编译时产生错误,如下所示:

./Example.java:3: error: cannot find symbol
    state = State.OFF;
                 ^
  symbol:   variable OFF
  location: class State
1 error

经过一个小时的努力,我终于解决了这个问题

实际上,有一个类名
State
,它是
线程
对象的一部分。因此,当我调用
State.OFF
时,编译器正在查找这个找不到的状态

您可以通过尝试去掉类声明中的
extends-Thread
部分来解决这个问题,它将正常运行。如果将
枚举
类型的名称从
状态
更改为其他名称,例如
状态
,也可以。因此,只有在从线程扩展并使用状态作为名称时,您才会遇到这个问题

仅供参考,您可以通过执行以下操作了解Thread对象的所有不同状态:

for (State s : State.values() {
    System.out.println(s);
}
您将得到如下结果:

NEW
RUNNABLE
BLOCKED
WAITING
TIMED_WAITING
TERMINATED

我必须说,对于像我这样的新手来说,这非常有趣。

事实上,您发现的是已经定义的已定义枚举。将状态用作类型时,它引用的是此类型,而不是您定义的类型。如果仍要使用自己的
状态
枚举,则需要使用其完全限定名。这里的教训是:不要扩展
线程
,而是实现并使用组合。这还提供了许多其他好处,例如防止API混乱,并允许您在必要时轻松切换到。甚至在中提到:“在大多数情况下,如果您仅计划覆盖run(),则应使用Runnable接口方法,而不是其他线程方法。这很重要,因为除非程序员打算修改或增强类的基本行为,否则类不应被子类化。“@codesparkle谢谢。我不知道。我根据我在这里读到的示例扩展了线程:关于Java中的监视器。下次我会记住这一点,只需
实现Runnable
。谢谢