【发布时间】:2017-05-16 15:15:35
【问题描述】:
我有以下代码:
eventBus.subscribe(new EventBusListener<NavigationEvent>() {
@Override
public void onEvent(Event<NavigationEvent> event) {
event.getPayload();
}
});
eventBus.subscribe(new EventBusListener<NotificationEvent>() {
@Override
public void onEvent(Event<NotificationEvent> event) {
event.getPayload();
}
});
IntelliJ 告诉我可以用 lambda 表达式替换这两个匿名类,例如:
eventBus.subscribe((EventBusListener<NavigationEvent>) Event::getPayload);
eventBus.subscribe((EventBusListener<NotificationEvent>) Event::getPayload);
编译运行良好,但在运行时应用程序崩溃并出现以下错误:java.lang.IllegalArgumentException: Could not resolve payload type 由 Event<T> 类的 getPayload() 引起。
lamdbas 和 generics 缺少什么?
【问题讨论】:
-
使用
Event::<NavigationEvent>getPayload明确类型 -
附带说明,这些不是 lambda,而是函数引用。它不适用于 lambda,因为 lambda 不能用于具有泛型类型的函数式接口
-
你能分享整个堆栈跟踪吗?
-
@njzk2:
getPayload不是通用方法,因此,使用Event::<NavigationEvent>getPayload没有意义,类型参数将被忽略。并且 lambda 表达式将起作用,与方法引用的程度相同。
标签: generics lambda java-8 anonymous-class