В соответствии с 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
. В принципе, я предположил, что какой бы класс был ближе к листу дерева наследования. Это работает, когда один класс является подклассом другого:
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
может относиться только к одному известному типу, тогда как A
может относиться к двум (A
и B
). Но это дает неоднозначную ошибку сравнения.
Как это на самом деле выбрать конструктор? Я прочитал the docs, но, честно говоря, я не мог полностью следить за тем, как он определяет специфику. Я надеюсь на точное описание того, почему он не может определить, что E
более конкретно, чем A
.
ничего не может быть: ***? extends String ***, строка string окончательна –
@ ΦXocę 웃 Пepeúpa ツ хорошая точка. Я исправлю это – ewok