我正在尝试将子类作为参数传递给方法。 到目前为止,我还没有成功,甚至告诉它不可能用Java做。我想要stackoverflow的意见,并提出建议让它发挥作用。
让我们假设'HelloEvent'扩展'事件'......
我有一个方法:
public void addListener(Consumer<? extends Event> consumer) {
[...]
}
和另一种方法:
public void listen(HelloEvent helloEvent) {
[...]
}
我想这样做:
的addListener(此::听);
在IDEA中,我遇到错误“无法解析方法侦听”。当然这是因为'listen'不是一个事件,而是一个子类。
有办法做到这一点吗?也许是一个解决方法?
我尝试过将它作为一个函数或用'super'替换'extends'并且它不起作用。我一直试图解决这个问题几周了。
答案 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);
});
}