【发布时间】:2016-12-23 02:49:53
【问题描述】:
根据this question,当尝试在模棱两可的重载构造函数之间进行选择时,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{}
“乙”
然后我想出了这个:
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)。但它给出了一个模棱两可的参考错误。
实际上是如何选择构造函数的?我通读了the docs,但坦率地说,我不太明白它是如何确定特异性的。我希望能准确描述为什么它无法确定 E 比 A 更具体。
【问题讨论】:
-
不可能是这样的:? extends String,字符串类是final
-
@ΦXocę웃Пepeúpaツ 好点。我会解决的
标签: java compiler-errors ambiguous-call