Java类名中的$有什么作用

Java类名中的$有什么作用,java,class,gson,Java,Class,Gson,我最近看到了Google库Gson的源代码,看到了一些非常奇怪的东西(IMO)。在com.google.gson.internal包中有两个类以“$”开头 比如说 public final class $Gson$Types { ... } 美元符号对开发有影响吗?还是只是对外部开发人员说“请不要使用,因为它是一个内部类”?从编译器/运行时的角度来看,它只是一个构成名称一部分的字符,如G或s。它没有任何特定的语义 但是,提示您应该避免在标识符中使用$字符: 标识符是Java字母和Java数字的

我最近看到了Google库Gson的源代码,看到了一些非常奇怪的东西(IMO)。在com.google.gson.internal包中有两个类以“$”开头

比如说

public final class $Gson$Types { ... }

美元符号对开发有影响吗?还是只是对外部开发人员说“请不要使用,因为它是一个内部类”?

从编译器/运行时的角度来看,它只是一个构成名称一部分的字符,如
G
s
。它没有任何特定的语义

但是,提示您应该避免在标识符中使用
$
字符:

标识符是Java字母和Java数字的无限长序列,其中第一个必须是Java字母

“Java字母”包括大写和小写ASCII拉丁字母
A
-
Z
\u0041
-
\u005a
)和A-Z(
\u0061
-
\u007a
),以及出于历史原因,ASCII下划线(
\u005f
)和美元符号(
$/code>,或
\u0024
)。
$
字符只能在机械生成的源代码中使用,或者很少用于访问遗留系统上预先存在的名称


您可以在标识符中使用任何货币符号或连续字符

通过使用$,它表明它是由生成生成的,例如由构建生成的,或者仅用于内部使用

只有当您与生成的类发生冲突时,才会导致问题,例如

class A {
     class B {
     }
}
class A$B {
}
报告

error: duplicate class: A.B
编译器生成的类不是以
$
开头的,这可能是这样做的原因

在Windows 7上,类中可能出现的特殊字符是

public static void main(String... args) throws IOException {
    for (char ch = 0; ch < Character.MAX_VALUE; ch++) {
        if (Character.isJavaIdentifierStart(ch) && !Character.isLetter(ch))
            System.out.println("interface " + ch + " { }");
    }
}

interface $ { }
interface _ { }
interface ¢ { }
interface £ { }
interface ¤ { }
interface ¥ { }
interface € { }
publicstaticvoidmain(String…args)抛出IOException{
对于(char ch=0;ch

Java允许使用其他特殊字符,但不支持将其作为文件名。这可能取决于操作系统,也可能取决于语言。

不,这是非常错误的,谷歌不应该这么做。$符号在嵌套类中专门保留为分隔符。许多代码,包括JDK,都依赖于这个约定(几乎每个人都遵守这个约定)。谷歌淘气的命名做法会破坏这些规则。

我认为你不能使用“任何”货币符号。来自JLS:“Java字母”包括大写和小写ASCII拉丁字母A-Z(\u0041-\u005a)和A-Z(\u0061-\u007a),以及出于历史原因,ASCII下划线(\u005f)和美元符号($,或\u0024)。美元字符只能在机械生成的源代码中使用,或者很少用于访问遗留系统上的现有名称。“例如,我怀疑欧元符号是否有效。@JonSkeet重要的单词是include。大多数货币符号也符合条件,包括欧元符号。欧元是允许的,但它是少数被允许的货币之一。在Windows 7上尝试了所有功能。;)这真的很有趣。我仍然很困惑,因为我不明白他们为什么这么做。我将假设美元符号暗示这些类已生成,但我仍然检查了整个svn repo,但没有看到任何可以生成这些类的内容。但是,即使它们是生成的,为什么有人会将它们提交到版本控制系统中呢?你能给出一个具体的例子吗?