如果我有一个像Java这样的类:
public class Test
{
// ...
public enum Status {
Opened,
Closed,
Waiting
}
// ...
}
我在另一个类文件中有一个不同的类(但在同一个项目/文件夹中):
public class UsingEnums
{
public static void Main(String[] args)
{
Test test = new Test(); // new Test object (storing enum)
switch(test.getStatus()) // returns the current status
{
case Status.Opened:
// do something
// break and other cases
}
}
}
我实际上会在另一个类中使用一个枚举(在我的例子中,特别是在switch-case语句中)。
然而,当我这样做时,我收到如下错误:
找不到符号 - 类状态
我该如何解决?
答案 0 :(得分:78)
枚举开关案例标签必须是枚举常量的非限定名称:
switch (test.getStatus()) // returns the current status
{
case Opened:
// do something
// break and other cases
}
它在另一个类中定义并不重要。在任何情况下,编译器都能够根据您的switch
语句推断枚举的类型,并且不需要限定常量名称。无论出于何种原因,使用限定名称都是无效的语法。
此要求由JLS §14.11指定:
SwitchLabel:
case ConstantExpression :
case EnumConstantName :
default :
EnumConstantName:
Identifier
(感谢Mark Peters'related post作为参考。)
答案 1 :(得分:10)
如果您的getStatus()
实际上返回Status
,则您的案例应为:
case Opened:
如果您尝试:
case Test.Status.Opened:
您的IDE会出现如下错误:
an enum switch case label must be the unqualified name of an enumeration constant
答案 2 :(得分:2)
NVM
它必须完全不合格,资格由switch()
ed变量的类型给出(在本例中为test.getStatus()
,即Test.Status
)。
<击>
您的Enum Status
是class Test
的一部分。因此,您需要对其进行限定:
Test test = new Test(); // new Test object (storing enum)
switch(test.getStatus()) // returns the current status
{
case Test.Status.Opened:
// do something
// break and other cases
}
击> <击> 撞击>
答案 3 :(得分:2)
由于Status
课程中包含Test
枚举,您需要使用Test.Status
而非Status
。
答案 4 :(得分:1)
枚举(或多或少)只是与其他类似的类,因此这里的规则与其他内部类相同。在这里,您可能想要将枚举类声明为static
:它不依赖于其封闭类的成员。在这种情况下,Test.Status.Opened
将是引用它的正确方法。如果你真的不认为该类是静态的,你可能需要使用一个实例作为“命名空间”限定符,即test.Status.Opened
。
编辑:显然,枚举是隐式静态的。考虑到枚举应该是什么,这是有道理的,但将它们明确地声明为静态可能是好的形式。
答案 5 :(得分:1)
我在课堂上宣布了一个枚举如下:
公共类MyBinaryTree {
private Node root;
public enum ORDER_TYPE {
IN_ORDER, POST_ORDER,
};
public void printTree(ORDER_TYPE order) {
//Printing tree here
}
}
我试图在另一个类中访问它
public class Solution1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyBinaryTree myTree = new MyBinaryTree();
myTree.printTree(myTree.ORDER_TYPE.POST_ORDER);
}
}
这里的问题是如果我使用实例对象来访问枚举ORDER_TYPE我得到编译时错误:&#34; ORDER_TYPE无法解析或不是字段&#34; < / p>
我再次检查并更改了我的代码,直接使用类名作为名称限定符
public static void main(String[] args) {
MyBinaryTree myTree = new MyBinaryTree();
myTree.printTree(MyBinaryTree.ORDER_TYPE.POST_ORDER);
}
这解决了这个问题 - 我相信每当我们在另一个类中使用一个类的枚举时 - 我们应该通过类来访问它,就像静态方法一样。
答案 6 :(得分:0)
试试这个例子
func textFieldShouldReturn(textField: UITextField!) -> Bool
{
messageTextField.resignFirstResponder()
return true;
}