Правильная реализация полиморфизма без Java запаха - PullRequest
0 голосов
/ 11 апреля 2020

Я построил 2 класса, которые реализуют один и тот же интерфейс и делают разные логи c в зависимости от типа экземпляра. Некоторые из методов получают тип интерфейса в качестве параметра и выполняют различную логику c в зависимости от типа экземпляра. Это было бы легко сделать с помощью instanceof, но мне нужно сделать это без какого-либо запаха.

Вот код, который я пробовал:

public class Concrete1 implements Interf{
    public boolean isMatch(Concrete1 s) {return true;}
    @Override
    public boolean isMatch(Interf s) {return false;}
}
public class Concrete2 implements Interf{
    public boolean isMatch(Concrete2 s) {return true;}
    @Override
    public boolean isMatch(Interf s) {return false;}
}

public static void main(String[] args) {
    Concrete1 c1=new Concrete1();
    Concrete2 c1=new Concrete2();
    Interf i1=new Concrete1();
    Interf i2=new Concrete2();
    System.out.println(c1.isMatch(c1));
    System.out.println(c1.isMatch(c2));
    System.out.println(i1.isMatch(i1));
    System.out.println(i1.isMatch(i2));
}

Ожидаемый результат будет:

true
false
true
false

Вместо этого я получаю:

true
false
false
false

1 Ответ

1 голос
/ 11 апреля 2020

Единственная строка, отличная от ваших ожиданий, это третья строка, результат:

i1.isMatch(i1)

i1 является ссылкой на Interf, поэтому компилятор выбирает метод, который принимает Interf. Он не может выбрать метод, который принимает Concrete1, потому что он рассматривает только методы, существующие в типе Interf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...