Вроде как это просто проверка и она необходимо только при "понижении", так? Если можно, то разжуйте каждую строчку public static void doWork(Person person) { if (person instanceof Person.User) { Person.User user = (Person.User) person; user.live(); } else if (person instanceof Person.Loser) { Person.Loser loser = (Person.Loser) person; loser.doNothing(); } else if (person instanceof Person.Coder) { Person.Coder coder = (Person.Coder) person; coder.writeCode(); } else if (person instanceof Person.Proger) { Person.Proger proger = (Person.Proger) person; proger.enjoy(); }