我有一个方法需要将回调对象作为参数然后(在需要的时候)我的方法将调用回调对象的特定方法。
我写了一个名为Manager
的类,它有一个名为addListener
的方法。作为此方法的参数,我需要使用由外部软件定义的回调对象。因此,我按以下方式定义addListener
:public void addListener(Listener listener)
。
当然Eclipse抱怨因为它不知道Listener
是什么(因为监听器是由外部软件定义的)。我知道(应该知道)关于Listener的唯一想法是它有一个名为doSomething
的方法。因此,为了让Eclipse愉快,我在Manager
类之前添加了一个接口:
interface Listener {
void doSomething();
}
public class CTManager {
...
问题似乎已经解决,但后来我尝试测试我的软件。所以,我创建了一个名为test
的类。在这个类中,我创建了一个Manager
类的实例,并尝试使用此实例的addListener
方法。
我还创建了一个类Listener
,实例化它并将实例提供给addListener
。它就是问题出现的地方。 Eclipse写道addListener
不适用于给定的参数。我认为这是因为它期望来自我的Listenr
界面,但是从Listener
类获得了一些东西。
我该如何解决这个问题?
答案 0 :(得分:2)
您正在寻找解决方案的正确途径。为了让2个软件彼此接口,2件需要就他们之间签订的合同达成一致。
像你描述的回调机制很常见。这里的契约是Listener
接口,您的部件用它来调用回调对象上的doSomething()
方法,另一部分需要实现该接口以提供有效的侦听器对象。
Java处理这些联系人的方式是让类加载器声明一部分软件的接口与另一部分使用的接口兼容(或等于)。
这意味着类或接口名称必须重合,但也包括它们的包。
当您构建经理时,您还提供合同的接口定义,例如:
com.your.program.manager.Listener
这意味着您必须提供文件的副本
com/your/program/manager/Listener.java
到buid回调对象的一方,以便他们可以导入与经理使用的相同Listener
定义。如果两个部分使用相同的定义,则联系人将起作用。
答案 1 :(得分:1)
您实例化的类Listener必须实现您声明为addListener函数的参数的Listener接口...
答案 2 :(得分:1)
您创建的Listener接口看起来与您尝试接受的第三方侦听器对象具有不同的包名称。
我首选的解决方案是在Eclipse Build Path中包含包含Listener对象的第三方库,然后您可以直接引用第三方对象。
如果有一些原因导致您无法执行此操作,请确保您的Listener接口与第三方侦听器类位于同一个程序包中,以便您的界面和第三方类的完全限定名称是完全相同的。
答案 3 :(得分:0)
我认为这可能是Eclipse中的构建路径问题。检查包含Listener
类的JAR文件是否在构建路径上。
另一种可能性是您在import some.package.Listener;
类的源代码中缺少CTManager
语句。