1

У меня есть следующий код: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.

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

Я видел эти 2 статьи:
Overloaded method selection based on the parameter's real type - не объясняющие мое дело, но случай, в котором тип s был бы объект.

https://stackoverflow.com/a/8356435/4345843 - этот ответ, если это правда, насколько я понимаю, поддерживает мою теорию.

Буду рад за пояснения.

ответ

2

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

0

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

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

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