如何访问与不同 class 的方法本地内部 class 同名的 class

How to access a class which have the same name as the Method Local Inner class of a different class

考虑以下代码

class A{}
class B{
    void main(){
        A a1=new A();
        class A{}
        A a2=new A();
        System.out.println(a1); // A@___
        System.out.println(a2); // BA@____
    }
}

class A 和 class B 不在任何包内,如何在方法 local inner [ 之后创建外部 class A inside main() 的对象=21=] 被创建。 换句话说,如何创建 "a2" 对象,即外部 class A 的对象?

我通过将这些 classes 放在一个包中来检查这一点,并且我能够使用完全限定名称创建外部 class A 的对象。但是,当它们不在任何包内时,找不到执行相同操作的方法。

您可以使用Class.forName()加载您想要实例化的class:

class A {}

class B {
     public static void main(String[] args) throws Exception {
         A a1 = new A();
         class A {}
         A a2 = new A();
         Class<?> clazz = Class.forName("A");
         Object a3 = clazz.getDeclaredConstructor().newInstance();

         System.out.println(a1); // A@___
         System.out.println(a2); // BA@____  
         System.out.println(a3); // A@___
     }
}

这是可行的,因为 B.main() 中的本地 class AB 在同一级别上声明的完全限定域名不同:

System.out.println(a1.getClass()); // class A
System.out.println(a2.getClass()); // class BA
System.out.println(a3.getClass()); // class A

我不得不使用 Object 作为 a3 的类型,因为一旦本地 class A 已声明。

如果您使用与外部 class 相同的内部 class 名称,那么您需要使用 引用外部 class.

的完全限定 class 名称

这就像同样的概念适用于局部声明获得更高优先级的方法或变量。

根据一般经验,不建议使用相同的 class 名称,这样更容易混淆

参考 link 阅读有关内容: https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.4.2

可以在此处找到关于类似内容的优秀 SO 答案。 Inner Class visibility SO Thread

两个 A classes 都没有包装,您无法区分它们。
由于引用了 A 类型,编译器将引用最多 local/close A class 声明:

A a1=new A(); // refer the outer (the single that is visible in this scope)
class A{}
A a2=new A(); // refer the inner : the closest in this scope

请注意,不推荐使用默认包,但使用相同的 class 名称确实是一件不可取的事情。

编辑

在本地 A class 之前声明 Supplier,您可以在本地 class 声明之后创建外部 A 对象,因为 Supplier 仅在调用 get() 时创建对象:

A a1=new A();
Supplier<A> Asupplier = A::new;
class A{}
System.out.println(a1); // A@___
System.out.println(Asupplier.get()); // A@_____