当前位置: 首页 > 面试题库 >

如果存在内部类,则包含美元符号的Java类名称无法编译

姚钊
2023-03-14
问题内容

我定义了以下Java类:

mac-grek:javajunk grek$ cat A\$B.java
class A$B {}
mac-grek:javajunk grek$ cat A.java
public class A {
  public static class B {}
}
mac-grek:javajunk grek$ cat Main.java 
public class Main {

  public static void main(String[] args) {
    System.out.println(A.B.class.getName());
    System.out.println(A$B.class.getName());
  }

}

当我尝试编译它们时,出现以下错误:

mac-grek:javajunk grek$ javac 'A$B.java' A.java Main.java
A.java:2: duplicate class: A.B
  public static class B {}
                ^
Main.java:4: cannot find symbol
symbol  : class B
location: class A
    System.out.println(A.B.class.getName());
                        ^
Main.java:5: cannot find symbol
symbol  : class A$B
location: class Main
    System.out.println(A$B.class.getName());
                       ^
3 errors

如果我删除A.java文件并System.out.println(A.B.class.getName());Main.java所有文件中编译:

mac-grek:javajunk grek$ cat A\$B.java 
class A$B {}
mac-grek:javajunk grek$ cat Main.java 
public class Main {

  public static void main(String[] args) {
    System.out.println(A$B.class.getName());
  }

}
mac-grek:javajunk grek$ javac A\$B.java Main.java
mac-grek:javajunk grek$

因此Java允许我定义一个名称中包含美元符号的类。如何编译我的原始示例?


问题答案:

之所以会发生名称冲突,是因为您定义的顶级类A $ B与类A的静态内部类B的生成名称具有相同的名称。由于两者都存在,因此编译器无法解决冲突。

JLS说:

$字符仅应在机械生成的源代码中使用,或很少用于访问旧系统上的现有名称。

由于您决定不遵守该规则,因此被javac所咬。我只是将A $ B重命名为其他名称。



 类似资料:
  • 我有包含以下内容的属性文件: 我使用spring配置阅读了以下内容: 但在应用程序开始后,我看到: 我需要,因为我要使用重新启动程序:https://stackoverflow.com/a/3655963/2674303 如何避免这个错误?

  • 问题内容: 这就是我现在正在做的。有没有更好的方法来访问超类? 我正在使用Google Web Toolkit进行编程,但是我认为这确实是一个通用的Java问题。 问题答案: 您可以使用所谓的qualified 。 [JLS 15.8.4。合格的](http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.8

  • 我必须用Java实现一个日志机制。所以我使用JEE,使用RequestFilter和拦截器。我把所有这些都放在一个叫做日志记录的包中。 我的类是:请求过滤器,响应过滤器和常量 所以我的问题是。因为类名已经存在于包中,所以不记录类名可以吗? 包日志记录和重复日志记录:请求过滤日志记录,响应过滤日志记录,ConstantsLogging

  • 问题内容: Python是否有任何内置功能可将数字添加到文件名(如果已存在)? 我的想法是,它将按某些OS的工作方式工作-如果将文件输出到已经存在该名称文件的目录中,则它将添加数字或对其进行递增。 即:如果“ file.pdf”存在,它将创建“ file2.pdf”,并下次创建“ file3.pdf”。 问题答案: 从某种意义上说,Python在模块中内置了此功能。不幸的是,您必须利用私有全局变量

  • 问题内容: 例如,它是Jikes RVM堆栈的一部分。 “访问”应为方法名称。但是我检查了类源代码及其接口,没有所谓的“访问”方法。我在Google上找不到答案,因为Google讨厌各种标点符号。有人可以帮忙吗?非常感谢。 问题答案: 引用@birryree链接的文章: 如果一个类将另一个类包围,或者如果它们被一个公共类包围,则另一个类D可以使用C类的私有成员m。由于虚拟机不知道这种分组方式, 因

  • 我有一个包含两个类的java包。A类和B类。我需要在B类中创建一个A类型的对象。我不知道发生了什么。请谁帮帮我。 包装; A类 B类 我用的是JDK1。5和tomcat,并将它们放在我的D驱动器的java文件夹中。 D:\java\jdk1。5. D:\java\tomcat 现在,我的包裹文件夹也在上面的位置 D:\java\pack 下面是我如何编译我的java类文件。 步骤1:编译A.jav