Обратите внимание, что весь код является упрощенным примером, чтобы передать только основные идеи моего вопроса. Все это должно быть скомпилировано и запущено после небольшого редактирования.
У меня есть несколько классов, которые реализуют общий интерфейс.
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 «Интер».
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() для получения нужных мне результатов, но было бы намного лучше сделать это с помощью приведения.
Я понимаю, что вопросы о подобных концепциях задавались и раньше, но, хотя все ответы были информативными, ни один из них не удовлетворил меня. Казалось, что двойная отправка будет работать, но это потребует переделки большого количества кода, поскольку я часто использую такие вещи.