この質問に従って、あいまいなオーバーロードされたコンストラクターから選択しようとすると、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{}
既知の 1 つのタイプのみを参照する可能性があるのに対し、2 つの (および) を参照する可能性があるためE
、出力する必要があると思います。しかし、あいまいな参照エラーが発生します。E
A
A
B
実際にコンストラクターを選択する方法は? 私はドキュメントを読みましたが、率直に言って、それが特異性をどのように決定するかを完全に理解できませんでした. E
より具体的であると判断できない理由の正確な説明を期待していA
ます。