繁体   English   中英

Java 内class 与其他顶级class同名

[英]Java inner class with the same name as other top level class

我有与 Java 内部类有关的问题。

有没有办法从定义内部 class A 的顶层 class Main 访问顶层 class A?

下面是演示问题的示例代码:

class A {   // Outer Class A
  { 
    System.out.println("A outer");
  }
}

class B {   // Outer Class B
  { 
    System.out.println("B outer"); 
  }
}

public class Main { 
  class A {  // Inner Class A
    {
      System.out.println("A inner");
    }
  }

  public void newA() {      
    class A {   // Local Class A
      { 
        System.out.println("A local");
      }
    }
    new A();
  }

  public static void main(String[] args) {
    new Main().newA();  // prints "A local"
    new Main().new A(); // prints "A inner"
    //new A();    // compiler error: No enclosing instance of type Main is Accessible.
    new B();      // but this works and prints "B outer" 
  }
}

使用完全限定的 class 名称:

new com.mypackage.A();

如果您的课程在包中,我希望这是实现这一目标的最简单方法。 我不相信有任何等效的 C# global:: for Java 来强制这种事情。

最终,我只是尝试更改 class 名称以避免首先发生问题。 这通常是比使用变通办法更好的方法。

您应该为您的两个A提供不同的 package 名称,以便它们明显不同的类型,然后您可以通过它们的全名引用它们。

例如:

my.package.for.toplevel.A outerA = new my.package.for.toplevel.A(); // prints "A outer"
                                                                    // if this is the
                                                                    // package

或者更好的是,为两个不同的类使用两个不同的名称。

据说内部 class 的名称与顶层 class 的名称相同。 顶层 class 不能在内部 class 的 scope 中通过其简单名称引用; 顶级 class 只能通过限定名称引用。

如果顶级 class 位于默认 package 中(在这种情况下,其规范名称与其简单名称相同),您仍然可以通过反射访问它。

是的,只需使用包或避免从一开始就使用相同的名称。 我想知道你为什么将它们命名为相同的名称?

为了解释您的错误,它来自它尝试访问内部 A 的事实,但是由于 class 未声明为 static 并且没有可用的 Main 实例,因此无法创建需要引用的非静态内部 A到父 Main 实例。

假设这些类在默认的 package 中。 要解决这种情况下的命名冲突,需要重命名冲突的类或使用命名的 package。 然后使用 FQCN 解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM