gpt4 book ai didi

java - 您可以将一个对象转换为实现接口(interface)的对象吗? (JAVA)

转载 作者:行者123 更新时间:2023-12-02 00:51:15 25 4
gpt4 key购买 nike

你能将一个对象转换为实现接口(interface)的对象吗?现在,我正在构建一个 GUI,并且我不想一遍又一遍地重写确认/取消代码(确认弹出窗口)。

所以,我想做的是编写一个类,该类传递给它所使用的,并告诉用户是否按下了“确认”或取消。 总是实现某个接口(interface)。

代码:

class ConfirmFrame extends JFrame implements ActionListener
{
JButton confirm = new JButton("Confirm");
JButton cancel = new JButton("Cancel");
Object o;

public ConfirmFrame(Object o)
{
// Irrelevant code here
add(confirm);
add(cancel);
this.o = (/*What goes here?*/)o;
}

public void actionPerformed( ActionEvent evt)
{
o.actionPerformed(evt);
}
}

我意识到我可能把事情变得过于复杂,但现在我已经遇到了这个问题,我真的想知道是否可以将一个对象转换为另一个实现特定接口(interface)的对象。

最佳答案

您可以在类型层次结构中向上或向下转换对象;有时这是安全的,有时则不安全。如果您尝试将变量转换为不兼容的类型(即尝试让编译器相信它不是),您将收到运行时异常(即错误)。转到更通用的类型(例如将 ActionListener 更改为 Object)称为向上转换,并且始终是安全的,假设您要转换到的类是其中之一当前类的祖先(Object 是 Java 中所有内容的祖先)。仅当您的对象实际上更具体类型的实例时,转到更具体的类型(例如从 ActionListener 转换为 MySpecialActionListener)才有效。

因此,就您而言,听起来您想要做的就是说ConfirmFrame实现了ActionListener接口(interface)。我假设该接口(interface)包括:

public void actionPerformed( ActionEvent evt);

然后,在该虚拟方法的实现中,您希望将 evt 委托(delegate)给传递到构造函数中的任何对象 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。

关于java - 您可以将一个对象转换为实现接口(interface)的对象吗? (JAVA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2986951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com