this questionで、あいまいなオーバーロードされたコンストラクタの中から選択しようとすると、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
であることがあります。基本的には、継承ツリーの葉に近いクラスが選択されると仮定しました。 1クラスは他のサブクラスである場合には動作します: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
は1つの既知のタイプのみを参照することができ、A
は2つを参照することができる(A
およびB
)。しかし、あいまいな参照エラーが発生します。実際にどのようにコンストラクタを選択していますか?私はthe docsを読んだが、率直に言って私はそれが特異性をどのように決定するかをかなり追うことができなかった。
E
がA
より具体的であると判断できない理由を正確に説明したいと考えています。
何もできません:***? String ***、string classはfinalです –
@ΦXocę笑Пepeúpaツー良い点。私はそれを修正します – ewok