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