Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将ActionListener添加到未知对象_Java_Object_Parameters_Actionlistener - Fatal编程技术网

Java 将ActionListener添加到未知对象

Java 将ActionListener添加到未知对象,java,object,parameters,actionlistener,Java,Object,Parameters,Actionlistener,我有以下问题: 我有这样一个函数: public void addActionListenerObject(Object object) { object.addActionListener(this); } 我的问题如下:我需要一个解决方案,可以通过addActionListener函数作为参数传递任何对象。 列表可在此处找到: 有没有一种方法可以在没有大量实例的情况下解决这个问题 谢谢您正在寻找的是多态性。Component类型的所有实例都有addActionListener方法。

我有以下问题:

我有这样一个函数:

public void addActionListenerObject(Object object) {
    object.addActionListener(this);
}
我的问题如下:我需要一个解决方案,可以通过addActionListener函数作为参数传递任何对象。 列表可在此处找到:

有没有一种方法可以在没有大量实例的情况下解决这个问题

谢谢

您正在寻找的是多态性。
Component
类型的所有实例都有
addActionListener
方法。更改方法签名,使其预期为
组件
,而不是
对象

我认为
addActioListener
是从
组件继承而来的。事实并非如此。
该方法单独添加到每个组件类型中,没有父类。

您要查找的是多态性。
Component
类型的所有实例都有
addActionListener
方法。更改方法签名,使其预期为
组件
,而不是
对象

我认为
addActioListener
是从
组件继承而来的。事实并非如此。

该方法单独添加到每个组件类型,没有父类。

保留签名

如果您无法更改方法签名(即,如果您必须接收
对象
,并且如果存在这样的方法定义,则调用
addActionListener()
),则将使用更通用/健壮的解决方案来检查实际对象是否定义了
addActionListener()
方法,也可以通过反思来实现。不管怎么说,这听起来是一个非常老套的方法

更改签名

如果您可以更改方法签名,请尝试使用
AbstractButton
(),这是为
JButton
JToggleButton
JMenuItem
定义此方法的超类,例如(请参阅“直接已知子类”和类定义树以了解实际提供方法的位置)

第二种方法只有在实际有一个超类定义该方法时才有效。如果有多个类,则必须使用
If-else
结构和
instanceof
+显式强制转换检查可能的类(这样才能保留原始
对象
签名)


如果您提供有关原始问题的更多信息(例如,为什么需要这种方法),我们可能会找到更好的方法。

保留签名

如果您无法更改方法签名(即,如果您必须接收
对象
,并且如果存在这样的方法定义,则调用
addActionListener()
),则将使用更通用/健壮的解决方案来检查实际对象是否定义了
addActionListener()
方法,也可以通过反思来实现。不管怎么说,这听起来是一个非常老套的方法

更改签名

如果您可以更改方法签名,请尝试使用
AbstractButton
(),这是为
JButton
JToggleButton
JMenuItem
定义此方法的超类,例如(请参阅“直接已知子类”和类定义树以了解实际提供方法的位置)

第二种方法只有在实际有一个超类定义该方法时才有效。如果有多个类,则必须使用
If-else
结构和
instanceof
+显式强制转换检查可能的类(这样才能保留原始
对象
签名)


如果您提供有关原始问题的更多信息(例如,为什么需要这种方法),我们可能会找到更好的方法。

如果允许您更改
addActionListenerObject
的签名,请传递函数接口(>=Java 1.8):

public class Just { private ActionListener actionListener; public void addActionListener(ActionListener actionListener) { this.actionListener = actionListener; } public void doIt() { System.out.println("Hello"); actionListener.actionPerformed(new ActionEvent(this, 3, "World")); } } public class MyActionListener implements ActionListener { public void addActionListenerObject(Consumer<ActionListener> consumer) { consumer.accept(this); } @Override public void actionPerformed(ActionEvent e) { System.out.println(e.getActionCommand()); } } 这张照片是:

Hello World 你好 世界
如果允许更改
addActionListenerObject
的签名,则传递函数接口(>=仅限Java 1.8):

public class Just { private ActionListener actionListener; public void addActionListener(ActionListener actionListener) { this.actionListener = actionListener; } public void doIt() { System.out.println("Hello"); actionListener.actionPerformed(new ActionEvent(this, 3, "World")); } } public class MyActionListener implements ActionListener { public void addActionListenerObject(Consumer<ActionListener> consumer) { consumer.accept(this); } @Override public void actionPerformed(ActionEvent e) { System.out.println(e.getActionCommand()); } } 这张照片是:

Hello World 你好 世界
类组件没有函数addActionListener。我有同样的想法,但我正在搜索正确的类,但我找不到它。请参阅我的编辑。最好是为每种必要的类型编写单独的方法。类组件没有函数addActionListener。我有同样的想法,但我正在搜索正确的类,但我找不到它。请参阅我的编辑。最好是为每种必要的类型编写单独的方法。这个类定义是什么?扩展/实现什么类/接口?
是ActionListener此
类定义是什么?扩展/实现什么类/接口?
这是一个ActionListener,因此使用AbstractButton的方法是我已经使用过的方法,但它没有覆盖其他对象。反射方法可能是最好的方法,但性能可能会有问题。我需要的方法,包装成一个图书馆由我多个行动侦听器。。。老实说,我可以让用户将我的对象添加为ActionListener,但感觉不对。if-else结构可能是最好的方法……反射方法更健壮,因为实现
addActionListener(…)
方法的任何第三方或未来的类都将在不更改代码的情况下工作。另一方面,如果需要该方法变得如此健壮的概率很低(这意味着可能会使用一组紧密的类,包括AbstractButton等),并且性能和代码可维护性是更重要的要求,我会选择
if-else
方法。与往常一样,最佳选择将取决于您实际问题的整体情况因此,使用AbstractButton的方法是我已经使用过的方法,但它并没有掩盖其他对象。反射法可能是最好的方法,但性能可能是个问题