【问题标题】:Access public enum from inner class从内部类访问公共枚举
【发布时间】:2015-02-14 16:19:24
【问题描述】:

我在文件State.java 中定义了一个enum

public enum State {
  NONE, CHOOSINGMUD, PLAYING
}

我有一个公共课程Server,我可以从中使用State.NONE 访问枚举,这工作正常。

但是,在Server 中,我定义了一个公共内部类,当我尝试在那里访问State.NONE 时,我得到一个cannot find symbol error

  symbol:   variable State
  location: class Server

如何在这个内部类中使用State?是否可以像我在Server 班级中那样直接这样做?在我看来,它正在其父类 (Server) 中寻找 State

这是我的内部类的代码。我已经简化了,但是这里的打印语句会返回同样的错误:

  public class ClientConnection extends Thread
  {
   private PlayerInterface player;

   ClientConnection(PlayerInterface player) throws IOException
   {
    this.player = player;
    System.out.println(State.NONE);
   }
  }

【问题讨论】:

  • 可以贴一下内部类的代码吗?
  • 我已经发布了内部类,希望对您有所帮助。
  • 最坏的情况,你可以将内部类设为静态。
  • 您可能与线程中的 State 对象发生冲突。它没有 NONE 属性...有很多称为 State 的对象,请确保它是您的,请查看您的导入语句

标签: java enums


【解决方案1】:

您的 State 类与没有 NONE 字段的内部类 java.lang.Thread.State 冲突。将您的枚举类重命名为其他名称,您的代码将正常工作

【讨论】:

  • 如果他使用枚举的绝对路径而不是仅使用 State.None 应该没问题。如果他不打算更改枚举数的名称,可能会更容易
  • 啊,解决了。非常感谢!
  • 这就是为什么必须始终定义一个包而不是使用默认包的原因。
  • @Saraiva 我更喜欢重命名 - 避免以后出现任何可能的混淆 :)
  • 我确实定义了一个包,但只在内部类的父级中定义了一次。对吗?
【解决方案2】:

我刚刚创建了一个包含这个的文件

public enum State {
  on, off
}

然后是一个包含这个的文件

public class SomeClass {
  private static class SomeInnerClass{
   State s = State.off;
    public void doSomething(State state){
      if(state == State.off){
        //do something
      }
    }
  }
}

似乎工作正常。我可以在内部类的类级别和方法中访问它。希望看看这会有所帮助

【讨论】:

  • 只是好奇:为什么创建单独的文件会起作用?谢谢。
  • 该操作已经有单独的文件,同上。我做了 op 正在做的事情,只是为了表明它确实应该工作,所以还有其他问题。
  • 谢谢,这确实有效,但不幸的是,由于其他原因,我无法将内部类设为静态。
  • @dylan 无论是否静态,它都可以工作......出于好奇,我也尝试过
  • @Unheilig 它的工作原理与文件无关。它必须在两个单独的文件中,因为这两个类都是公共的。但这一个有效,因为与 OP 的情况不同,与 State 没有命名冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2014-10-30
  • 2018-01-22
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
相关资源
最近更新 更多