Функции 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);