Пытается реорганизовать код, и я наткнулся на проблеме, которая может быть продемонстрирована с помощью следующего кода:метод перегрузки, почему супертип должен быть отлит
public static abstract class Animal {
public abstract void attack(Animal other);
}
public static class Cat extends Animal {
@Override
public void attack(Animal other) {
catAttack(other); <-------- Problem here
}
private void catAttack(Cat other) {
// Maybe a meow showdown wins the fight, no need to get physical
}
private void catAttack(Dog other) {
// Dogs are dangerous, run!
}
}
public static class Dog extends Animal {
@Override
public void attack(Animal other) {
}
}
Почему это специфический типа other
в catAttack(other)
не может можно найти так, чтобы можно было назвать наиболее специфический метод? Вместо этого проверка должно быть сделано:
if (other instanceof Cat)
catAttack((Cat) other);
if (other instanceof Dog)
catAttack((Dog) other);
Edit: Вопрос был, возможно, немного неясно, вот пояснение я отправил как комментарий к ответу:
кошка может атаковать собаку или другой кот, который оба являются животными, мне любопытно, почему бремя бросания другого животного на собаку или кошку на меня, почему я не пытаюсь посмотреть, является ли это кошкой или собакой, потому что у меня есть два метода, которые соответствуют либо кошке, либо собаке, а затем бросают ошибку, если вместо этого это был слон?
, связанный с двойным удалением - http://en.wikipedia.org/wiki/Double_dispatch – Jayan