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