【问题标题】:Cannot find symbol error when importing enum class导入枚举类时找不到符号错误
【发布时间】:2021-06-25 23:48:16
【问题描述】:

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

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 类,因此不存在类冲突。我在项目目录中的其他类没有嵌套类,不要从其他类扩展/实现,或者导入在其依赖项中具有 TokenType 类的库。在每次编译之前,我已经清理了所有过时类的目录,甚至更改了调用 javac 的顺序。任何帮助都会很棒,谢谢。


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

【问题讨论】:

  • “我省略了明确的包名”。您应该用其他类似的东西替换它,而不仅仅是省略它。在这里省略这样的问题并没有帮助。

标签: java import enums javac


【解决方案1】:

从编译器可以解析Map &lt;String, TokenType&gt;中的简单名称TokenType这一事实来看,似乎TokenTypeScanner在同一个包中声明。

您还说您“省略了显式包名”,这意味着这两个类都没有在默认包(static imports are not possible if they are in the default package)中声明,而是在某些包中声明了名称。假设他们都在

package com.example.foo;

那你需要做的:

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

请注意,即使您位于可以通过其简单名称访问类型的位置,您仍然需要在static import declaration. 中使用其canonical name(基本上是完全写出包名称),并且名称必须是qualified(形式为X.Y),这就是默认包中的类不起作用的原因。

【讨论】:

  • 谢谢!希望我能支持你的答案。将我的项目放在命名包中是解决方案;似乎 Java 禁止从默认包进行任何类型的导入。对于未来的读者,此链接包含大量有关进口规则/标准的信息。 mindprod.com/jgloss/import.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 2021-12-21
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
相关资源
最近更新 更多