Функции Java 2 с сигнатурами суперкласса и подкласса - выбирает суперкласс, несмотря на то, что тип подкласса является подклассом

У меня есть следующий код:

public class Main {

    public boolean equals(String other){
        return other == new Object();
    }

    public boolean equals(Object other){
        return other == new Object();
    }

    public static void main(String[] args){
        String s = "";
        Object b1 = new Main();
        System.out.println(b1.equals(s));

    }

}

Насколько я знаю, equals Выбор метода должен работать следующим образом: во время компиляции будет выбрана подпись, и так как s имеет тип времени компиляции (например, type), метод с параметром String должен быть выбран, а так как b1 это пример Main тогда мы войдем в наш Main реализация equals скорее, чем Object"S.

Тем не менее, при отладке я вижу, что я ввожу Main реализация с параметром типа Object,

Я видел эти 2 статьи:
Выбор перегруженного метода на основе реального типа параметра - не объясняет мой случай, но случай, в котором тип s был бы объектом.

/questions/17293300/peregruzka-eto-polimorfizm-vremeni-kompilyatsii-v-samom-dele/17293308#17293308 - этот ответ, если он верный, насколько я понимаю, поддерживает мою теорию.

Буду рад объяснениям.

2 ответа

Решение

Это потому, что вы назначаете Main экземпляр для Object переменная. Object не содержит equals(String) метод, и, следовательно, единственный метод, который подходит - equals(Object) - выбран.

Добавьте этот код в начало equals(Object other) метод

if(other instanceof String)
return equals((String)other);

В дополнение к этому я не уверен, насколько полезны методы equals, так как вы делаете это return other == new Object();, То, что вы, вероятно, должны делать, это нечто ближе к this.equals(other);

Другие вопросы по тегам