Java 对具有参数的对象调用非静态方法引用

Java 对具有参数的对象调用非静态方法引用,java,events,event-handling,java-8,Java,Events,Event Handling,Java 8,我正在创建一个事件处理框架,并希望执行以下操作: // E: event listener interface, T: event class class EventManager<E, T> { ArrayList<E> listeners = new ArrayList<E>(); // `method` is some sort of reference to the method to call on each listener.

我正在创建一个事件处理框架,并希望执行以下操作:

// E: event listener interface, T: event class
class EventManager<E, T> {

    ArrayList<E> listeners = new ArrayList<E>();

    // `method` is some sort of reference to the method to call on each listener. There is no `MethodReference` type, I just put it there as I'm not sure what type should be in its place
    protected void notifyListeners(MethodReference method, T eventObj) {
        for (E listener : listeners) // call `method` from `listener` with `eventObj` as an argument
   }
}

class SpecialisedEventManager extends EventManager<SomeListener, SomeEvent> {

    // Some method that would want to notify the listeners
    public void foo() {
        ...
        // I would like onEvent() to be called from each listener with new SomeEvent() as the argument
        notifyListeners(SomeListener::onEvent, new SomeEvent());
        ...
    }

    // Some other method that would want to notify the listeners
    public void bar() {
        ...
        notifyListeners(SomeListener::onOtherEvent, new SomeEvent());
        ...
    }

}

interface SomeListener {
    public void onEvent(SomeEvent event);
    public void onOtherEvent(SomeEvent event);
}
//E:事件侦听器接口,T:事件类
类事件管理器{
ArrayList侦听器=新的ArrayList();
//'method'是对每个侦听器调用的方法的某种引用。没有'MethodReference'类型,我只是把它放在那里,因为我不确定应该使用什么类型
受保护的void notifyListeners(MethodReference方法,T eventObj){
for(E listener:listeners)//使用'eventObj'作为参数从'listener'调用'method'
}
}
类SpecializedEventManager扩展了EventManager{
//某个要通知侦听器的方法
公共图书馆{
...
//我希望使用new SomeEvent()作为参数从每个侦听器调用onEvent()
notifyListeners(SomeListener::OneEvent,new SomeEvent());
...
}
//其他一些想要通知侦听器的方法
公共空白栏(){
...
notifyListeners(SomeListener::OnTheEvent,new SomeEvent());
...
}
}
接口侦听器{
公共无效事件(SomeEvent事件);
事件(某些事件)的公共无效;
}

但是我不确定如何引用
onEvent()
onOtherEvent()
方法,以便使用正确的参数从每个侦听器对象调用它们。有什么想法吗?

方法引用只是实现功能接口的一种方式,因此您必须为自己定义一个合适的接口或进行匹配

由于您的侦听器方法使用目标侦听器实例和事件对象,并且不返回值,因此是合适的类型:

protected void notifyListeners(BiConsumer<E,T> method, T eventObj) {
    for(E listener: listeners)
        method.accept(listener, eventObj);
}
受保护的void notifyListeners(双消费者方法,T eventObj){
for(E侦听器:侦听器)
accept(监听器,eventObj);
}

方法引用
SomeListener::OneEvent
SomeListener::OnTheEvent
的形式与lambda表达式
(l,e)->l.OneEvent(e)
(l,e)->l.OnTheEvent(e)
类似,这就是目标实例成为第一个函数参数的原因。

MethodReference接口是什么样子的?@Flown它实际上不存在,我只是把它放在那里以符合Java的语法。我不知道应该用什么类型来代替它。为什么不为一个合适的接口找一个呢?您所要做的就是查找参数和返回类型…@Holger我确实搜索了,但我不确定如何将使用者应用于侦听器对象和参数。