Sublime Text 无法识别 NumberFormat

Sublime Text cannot recognize NumberFormat

我在 (Windows 10) sublime text 3 文件 NumberFormat.java 中有以下简单代码,用于将 double 格式化为美国货币:

import java.util.Scanner;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberFormat {

    public static void main(String[] args) {
        double num = 1000.322;
        NumberFormat defaultFormat = NumberFormat.getCurrencyInstance();
        System.out.println("US: " + defaultFormat.format(num));
        return;
    }
}

但是,当我构建时,以下错误专门针对 NumberFormat。

NumberFormat.java:2: error: NumberFormat is already defined in this compilation unit
import java.text.NumberFormat;
^
NumberFormat.java:10: error: cannot find symbol
        NumberFormat defaultFormat = NumberFormat.getCurrencyInstance();
                                                 ^
  symbol:   method getCurrencyInstance()
  location: class NumberFormat
NumberFormat.java:11: error: cannot find symbol
        System.out.println("US: " + defaultFormat.format(num));
                                                 ^
  symbol:   method format(double)
  location: variable defaultFormat of type NumberFormat
3 errors

据我所知,代码没有任何错误。此外,此代码片段在所有其他 IDE 和文本编辑器上都应该输出 US: 00.32。有人可以解释这些错误是什么意思吗?为什么它们只出现在 sublime text 中?

我认为您应该将 class 名称修改为与导入的 class 名称不同的 class,或者您可以将来源更改为 java.text.NumberFormat defaultFormat = java.text.NumberFormat.getCurrencyInstance();

问题是您将名为 NumberFormat 的 class 导入到具有相同名称的 class 中。这导致混淆 class NumberFormat 实际指的是什么。

(实际上你心里有困惑。Java 语言规范对此很清楚。它说 NumberFormat 将专门引用你的 class。导入没有效果。任何兼容的 Java 编译器都会做出相同的解释。)

有两种解决方案:

  1. 不要导入 class。而是使用其完全限定名称来引用它。

  2. 更改 class 的名称,以免与您导入的 class 冲突。

在我看来,第二种解决方案更好。特别是因为 NumberFormat 对你的 class 来说不是一个好名字。


And why they exclusively occur with sublime text?

他们没有。您编写的代码无法使用任何符合标准的 Java 编译器进行编译。

import java.text.NumberFormat

与同一文件中定义的类型冲突。更改您的 class 名称可以解决问题。

这不是 Sublime 的问题。 Sublime 只是从您的路径调用 javac 命令。如果你在 sublime

之外使用 javac 编译,你会得到相同的结果

更改 class 名称或成为显式包名称的一部分可解决问题