Приведение отражений и диспетчеризация перегруженных методов в Java

Обратите внимание, что весь код является упрощенным примером, чтобы передать только основные идеи моего вопроса. Все это должно быть скомпилировано и запущено после небольшого редактирования.

У меня есть несколько классов, которые реализуют общий интерфейс.

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() для получения нужных мне результатов, но было бы намного лучше сделать это с помощью приведения.

Я понимаю, что вопросы о подобных концепциях задавались и раньше, но, хотя все ответы были информативными, ни один из них не удовлетворил меня. Казалось, что двойная отправка будет работать, но это потребует переделки большого количества кода, поскольку я часто использую такие вещи.

5
задан Adno 28 March 2012 в 03:08
поделиться