Java:在重载构造函数之间进行选择
根据这个问题,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
? 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{}
“B”
然后我想出了这个:
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{}
我认为它应该打印,因为可能只指一种已知类型,而可能指两种(和)。但它给出了一个模棱两可的引用错误。E
E
A
A
B
它实际上是如何选择构造函数的?我通读了文档,但坦率地说,我无法完全理解它如何确定特异性。我希望能够确切地解释为什么它不能确定这比更具体。E
A