导入枚举时找不到符号错误 class

Cannot find symbol error when importing enum class

因此,在依赖它的 class 中静态导入枚举时,我遇到了找不到符号错误。它们都位于同一目录中的不同文件中。我省略了一个明确的包名称。

TokenType.java

// No imports
enum TokenType {
  
  ADD, MINUS, MULTIPLY, DIVIDE,
  ...

}

Scanner.java

import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Map;

import static TokenType.*; // <--- (error: cannot find symbol)

class Scanner {
  
  private static final Map <String, TokenType> keywords; // <--- (no error; javac can resolve the class name just fine)

  static {
    keywords = new HashMap<>();
    keywords.put("+", ADD); // <-- (error: cannot find symbol, which makes sense)
    keywords.put("-", MINUS);
    ...
  }
  ...
}

我只是不确定如何进行。名称均已正确键入,并且只有一种 TokenType class,因此不存在 class 冲突。我在项目目录中的其他 classes 没有嵌套 classes,不要从其他 classes extend/implement,或导入具有 TokenType class 的库在他们的依赖中。在每次编译之前,我已经清除了目录中所有陈旧的 classes,甚至更改了我调用 javac 的顺序。任何帮助都会很棒,谢谢。


编辑:解决方案是将它们放在一个命名包中。 Java 不允许从默认包导入。

从编译器可以解析 Map <String, TokenType> 中的简单名称 TokenType 的事实来看,似乎 TokenType 是在与 Scanner 相同的包中声明的。

你还说你“省略了一个明确的包名”,这意味着这两个 类 都没有在默认包()中声明,但是一些包有一个名字.假设他们都在

package com.example.foo;

然后你需要做:

import static com.example.foo.TokenType.*;

请注意,即使您所在的位置可以使用其简单名称访问该类型,您仍然需要使用其 canonical name (basically with the package name fully written out) in a static import declaration., and the name has to be qualified(以 X.Y 的形式),这就是为什么类 在默认包中不起作用。