Вы можете приводить объекты вверх или вниз по иерархии типов; иногда это безопасно, а иногда нет. Если вы попытаетесь привести переменную к несовместимому типу (то есть попытаться убедить компилятор в том, что это не так), вы получите исключение во время выполнения (т.е. ошибка). Переход к более общему типу (например, замена ActionListener
на Object
) называется апкастингом и всегда безопасен, если предположить, что класс, к которому вы приводите, является одним из предков вашего текущего класса (и Object
является предком всего в Java). Переход к более конкретному типу (например, приведение от ActionListener
к MySpecialActionListener
) работает только в том случае, если ваш объект является экземпляром более конкретного типа.
Итак, в вашем случае звучит так, будто вы пытаетесь сказать, что ConfirmFrame реализует интерфейс ActionListener. Я предполагаю, что этот интерфейс включает в себя:
public void actionPerformed( ActionEvent evt);
И здесь, в вашей реализации этого виртуального метода, вы хотите делегировать evt тому объекту, который o
был передан в конструктор. Проблема в том, что Object
не имеет метода с именем actionPerformed
; только более специализированный класс (в данном случае, реализация ActionListener
, подобная вашему ConfirmFrame
классу) будет иметь его. Так что вы, вероятно, хотите, чтобы этот конструктор взял ActionListener
вместо Object
.
class ConfirmFrame extends JFrame implements ActionListener
{
JButton confirm = new JButton("Confirm");
JButton cancel = new JButton("Cancel");
ActionListener a;
public ConfirmFrame(ActionListener a)
{
// Irrelevant code here
add(confirm);
add(cancel);
this.a = a;
}
public void actionPerformed( ActionEvent evt)
{
a.actionPerformed(evt);
}
}
Конечно, более понятные имена переменных, чем "o" или "a", вероятно, помогут вам (и всем, кто читает это) понять, почему вы передаете ActionListener в другой ActionListener.