[英]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.