如何访问与不同 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 A
与 B
在同一级别上声明的完全限定域名不同:
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@_____
考虑以下代码
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 A
与 B
在同一级别上声明的完全限定域名不同:
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@_____