根据这个问题,当尝试在模棱两可的重载构造函数之间进行选择时,Java 将选择“最具体”的选项。在这个例子中:
public class Test{
private Test(Map map){
System.out.println("Map");
}
private Test(Object o){
System.out.println("Object");
}
public static void main(String[] args){
new Test(null);
}
}
它会打印
“地图”
但是,我试图弄清楚“最具体”的确切含义。我认为它的意思是“最不模棱两可”,如“可能指的是最少可能的类型”。在这种情况下,Object
可能是任何不是原始的东西,而Map
可能只是Map
or ? extends Map
。基本上,我假设无论哪个类更接近继承树的叶子,都会被选中。当一个类是另一个类的子类时,这是有效的:
public class Test{
private Test(A a){
System.out.println("A");
}
private Test(B b){
System.out.println("B");
}
public static void main(String[] args){
new Test(null);
}
}
class A{}
class B extends A{}
“乙”
然后我想出了这个:
public class Test{
private Test(A a){
System.out.println("A");
}
private Test(E e){
System.out.println("E");
}
public static void main(String[] args){
new Test(null);
}
}
class A{}
class B extends A{}
class C{}
class D extends C{}
class E extends D{}
我认为它应该 print E
,因为E
可能只指一种已知类型,而A
可能指两种(A
和B
)。但它给出了一个模棱两可的参考错误。
它实际上是如何选择构造函数的?我通读了文档,但坦率地说,我不太明白它是如何确定特异性的。我希望能准确描述为什么它不能确定E
比A
.