Я хотел бы выполнить несколько операций на основе типа объекта и без использования instanceof
. Сначала я думал о перегрузке методов, основанных на типах (как показано ниже), и думал, что, возможно, Java будет выбирать метод соответствующим образом (на основе самого конкретного класса объекта).Сделать Java наиболее конкретным при выборе метода среди перегруженных методов
import java.util.ArrayList;
import java.util.List;
public class TestA {
public static void main(String[] args)
{
List<Object> list = new ArrayList();
list.add(new A());
list.add(new B());
list.add(new C());
list.add(new Object());
TestA tester = new TestA();
for(Object o: list)
{
tester.print(o);
}
}
private void print(A o)
{
System.out.println("A");
}
private void print(B o)
{
System.out.println("B");
}
private void print(C o)
{
System.out.println("C");
}
private void print(Object o)
{
System.out.println("Object");
}
}
class A {
}
class B extends A {
}
class C {
}
Выход:
Object
Object
Object
Object
Однако выход я после:
A
B
C
Object
- Есть ли способ сделать Java выбрать метод, основанный на наиболее конкретный тип объекта параметра?
- Если нет, то какие альтернативы я могу смотреть на такой функциональности, без помощи
instanceof
- Я был на самом деле пытается имитировать шаблон посетителя однако, кажется, что делает шаблон посетитель работы из-за двойной отправки , что делает параметр «принят» в правильном типе во время вызова функции, в частности,
visitor.accept(this)
вclass A
вызывает вызов функцииvisitor.accept(A o)
. - Я честно против
instanceof
, потому что я читал, используя это плохая практика; в этом случае, будет ли это еще плохая практика?
Разве ваш 'C' класс не расширяет' B' или 'A'? –
@RohitJain Nope. Предполагается, что C - это еще один класс. – Chad
Тогда я боюсь, что вы не сможете этого сделать без проверки «instanceof» и соответствующего кастинга. Тем не менее, позвольте мне еще раз взглянуть на ваш код. –