Обърнете внимание, че целият код е опростен пример, за да комуникира само основните идеи на моя въпрос. Все пак всичко трябва да се компилира и стартира след леко редактиране.
Имам няколко класа, всички от които реализират общ интерфейс.
public interface Inter{}
public class Inter1 implements Inter{}
public class Inter2 implements Inter{}
В отделен клас имам списък от тип Inter, който използвам за съхраняване и премахване на типове Inter1 и Inter2, въз основа на въвеждане от потребителя.
java.util.ArrayList<Inter> inters = new java.util.ArrayList<Inter>();
Също така имам семейство от претоварени методи, които се занимават с това как всяка реализация взаимодейства една с друга, заедно с реализация по подразбиране за 2 "Inter".
void doSomething(Inter in1, Inter in2){
System.out.println("Inter/Inter");
}
void doSomething(Inter1 in1, Inter1 in2){
System.out.println("Inter1/Inter11");
}
void doSomething(Inter2 in1, Inter1 in2){
System.out.println("Inter2/Inter1");
}
Методите периодично се наричат така:
for(int i = 0; i < inters.size() - 1; i++){
for(int o = i+1; o < inters.size(); o++){
Inter in1 = inters.get(i); Inter in2 = inters.get(o);
doSomething(in1.getClass().cast(in1), in2.getClass().cast(in2));
System.out.println("Class 1: " + in1.getClass().getName());
System.out.println("Class 2: " + in2.getClass().getName());
}
}
Примерен резултат от това е:
Inter/Inter
Class 1: Inter
Class 2: Inter
Inter/Inter
Class 1: Inter
Class 2: Inter1
Inter/Inter
Class 1: Inter1
Class 2: Inter1
Гледайки изхода, става ясно, че doSomething(Inter in1, Inter in2) се извиква дори в случаите, когато трябва да се извикат други методи. Интересното е, че изведените имена на класове са правилните.
Защо java има статично претоварване на метода, когато типовете класове се определят по време на изпълнение с помощта на отражение? Има ли някакъв начин да накарате Java да направи това? Знам, че мога да използвам отражение и Class.getMethod() и method.invoke(), за да получа резултатите, които искам, но би било много по-изпипано да го направя с кастинг.
Осъзнавам, че въпроси за подобни концепции са задавани и преди, но въпреки че всички отговори бяха информативни, никой не ме задоволи. Двойното изпращане изглеждаше така, сякаш ще работи, но това би означавало преработка на много код, тъй като често използвам този тип неща.