У меня есть этот простой интерфейс / класс:
public abstract class Message {}
public class Message1 extends Message {}
public class Message2 extends Message {}
И служебный класс:
public class Utility {
public void handler(Message m) {
System.out.println("Interface: Message");
}
public void handler(Message1 m) {
System.out.println("Class: Message1");
}
public void handler(Message2 m) {
System.out.println("Class: Message2");
}
}
Теперь основной класс:
public static void main(String[] args) {
Utility p = new Utility();
Message1 m1 = new Message1();
p.handler(m1);
Message m = (Message) m1;
p.handler(m);
}
Выход
> Class: Message1
> Interface: Message
Я бы p.handler(m)
вызвал бы метод p.handler(m:Message1)
Я не хочу использовать «ручную» команду instanceof
, потому что у меня много дел:
if(m instance of Message1)
p.handler((Message1)m)
else if (m instanceof Message2)
p.handler((Message2)m)
...
Если я позвоню m.getClass()
, я получу «mypackage.Message1», поэтому подкласс, а не суперкласс.
Я пытаюсь с этим кодом (использовать отражение):
p.handler(m.getClass().cast(m));
Но на выходе получается
> Interface: Message
Итак, это моя проблема. Я бы выполнил приведение объекта суперкласса во время выполнения к подклассу объекта без использования istanceof "code command".
Я бы выбрал правильную команду:
p.handler((m.getclass)m);
Как мне его получить? Это возможно?