Par cette question, Java, sélectionnez "plus spécifiques" option lorsque vous essayez de sélectionner entre ambigu constructeurs surchargés. Dans cet exemple:
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);
}
}
il apparaîtra à l'impression
"La carte"
Cependant, j'ai été à essayer de comprendre exactement ce que "plus spécifique" signifie. Je suppose qu'il voulait dire "le moins ambigu", comme dans "peut renvoyer au plus petit nombre possible de types." Dans ce contexte, Object
peut être quelque chose qui n'est pas un primitif, tandis que d' Map
ne peuvent être Map
ou ? extends Map
. En gros, je suppose que selon la classe était plus proche de la feuille de l'arbre d'héritage doit être sélectionné. Qui fonctionne quand une classe est une sous-classe de l'autre:
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"
Puis je suis arrivé à ceci:
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{}
Je pense qu'elle devrait imprimer E
, comme E
ne peuvent renvoyer qu'à un type connu, alors qu' A
peut se référer à deux (A
et B
). Mais il donne une référence ambiguë d'erreur.
Comment est-il réellement le choix du constructeur? J'ai lu les docs mais franchement, je ne pouvais pas tout à fait suivi la façon dont il détermine la spécificité. J'espère pour une description de exactement pourquoi il ne peut pas déterminer qu' E
plus précis que l' A
.