Java对引用另一个类的子类的方法的引用

时间:2018-06-12 23:49:58

标签: java functional-programming extends consumer

我正在尝试将子类作为参数传递给方法。 到目前为止,我还没有成功,甚至告诉它不可能用Java做。我想要stackoverflow的意见,并提出建议让它发挥作用。

让我们假设'HelloEvent'扩展'事件'......

我有一个方法:

public void addListener(Consumer<? extends Event> consumer) { 
     [...]
}

和另一种方法:

public void listen(HelloEvent helloEvent) { 
    [...]
}

我想这样做:

的addListener(此::听);

在IDEA中,我遇到错误“无法解析方法侦听”。当然这是因为'listen'不是一个事件,而是一个子类。

有办法做到这一点吗?也许是一个解决方法?

我尝试过将它作为一个函数或用'super'替换'extends'并且它不起作用。我一直试图解决这个问题几周了。

2 个答案:

答案 0 :(得分:1)

好吧, 只能listen到任何Event,只能HelloEvent

应该是Consumer<? super Event>,因为例如{{3}}。

在这种情况下,你可以写

addListener(event -> {
  if (event instanceof HelloEvent) {
    listen((HelloEvent) event);
  }
});

......老实说,但没有什么能做到的。您必须明确检查它是HelloEvent

答案 1 :(得分:0)

即使您可以这样做,在调用侦听器时也会得到ClassCastException。但是,如果您将类型包含在addListener中,则可以添加逻辑来过滤它。

void addListener(Consumer<? super Event> listener) {
    [...]
}
<T extends Event> void addListener(Class<T> type, Consumer<T> listener) {
    addListener(evnt -> {
        if (type.isInstance(evnt))
            listener.accept(evnt);
    });
}