Per этот вопрос, 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
). Но это дает неоднозначную ошибку ссылки.
Как он на самом деле выбирает конструктор? Я прочитал документы, но, честно говоря, я не мог точно следить за тем, как он определяет специфику. Я надеюсь на точное описание того, почему он не может определить, что E
более конкретный, чем A
.