当前位置: 首页 > 知识库问答 >
问题:

lambda vs匿名类

卢文博
2023-03-14
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();
    }
});
eventBus.subscribe((EventBusListener<NavigationEvent>) Event::getPayload);
eventBus.subscribe((EventBusListener<NotificationEvent>) Event::getPayload);

编译工作正常,但在运行时应用程序崩溃,出现以下错误:java.lang.IllegalArgumentException:无法解析由Event 类的getPayload()导致的有效负载类型

Lamdbas泛型缺少了什么?

共有1个答案

姬墨竹
2023-03-14

方法引用没有问题,但是IllegalArgumentException也没有被该子系统抛出。

问题似乎与eventbus.subscribe在内部所做的事情有关。由于类型擦除,只有一个subscribe(EventBusListener)方法,不知道传入的是EventBusListener 还是EventBusListener

正如消息“不能解析有效负载类型”所指出的,它无论如何都试图找出实际的有效负载类型,这意味着使用反射。这只适用于可再现类型,即非泛型类型。您的匿名内部类是可显示的类型,它们本身并不是泛型的,而是具有一个泛型超级类/接口,可以通过getGenericSuperClass()Resp进行检查。getGenericInterfaces()

在该上下文中使用方法引用或lambda表达式的问题是,如果接口是泛型的,则生成的运行时类将无法显示,即无法通过反射找到实际的类型参数。就像你写了

eventBus.subscribe(Event::getPayload);

除非有一个重载方法允许您显式指定有效负载类型,否则这将不能用于lambda表达式或方法引用。

视框架如何在内部解析类型而定,使用一个可显示的接口可能会起作用,例如。

interface NavigationEventListener extends EventBusListener<NavigationEvent> {}
…

eventBus.subscribe((NavigationEventListener)Event::getPayload);
 类似资料:
  • 一个元素可以按照HTML元素的嵌套方式包含其他元素,大多数情况下,框都是由显式定义的元素所生成的。 然而,当把文本直接添加到一个块容器元素中(不是包含在行内元素)时,即便没有为这些文本显式定义元素,它们也会生成框。 没有被元素显式包含的文本,称作匿名文本,因为没有与之关联的元素。把匿名文本所生成框,称作匿名框。匿名框分为两种,一种是匿名块框,另一种是匿名行内框。 当把文本直接添加到一个块容器元素中

  • 匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下: 这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使代码更加简洁、紧凑,模块化程度更高。 匿名类有两种实现方式: 继承一个类,重写其方法。 实现一个接口(可以是多个),实现其方法。 下面通过代码来说明。 程序的输出结果如下: 从输出结果可以看出,匿名内部类有

  • 本文向大家介绍Java匿名类,匿名内部类实例分析,包括了Java匿名类,匿名内部类实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java匿名类,匿名内部类。分享给大家供大家参考,具体如下: 内部类 匿名类  首发日期 :2018-03-25 内部类: 在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外部类】 如果想要通过一个类来使用另一个类,可以定

  • 可能重复: 什么是双大括号初始化在Java? 在查看一些遗留代码时,我遇到了一些非常令人困惑的问题: 在调试模式下运行代码后,我发现匿名块是在调用构造函数之后调用的。上面的功能和做的有什么不同: ?我会认为它们在功能上是等价的,并且会认为后一种方式是更好/更干净的编写代码的方式。

  • 问题内容: 我想我了解Anonymous类的基础知识,但我想澄清一些内容。当我有这样的语法时 如果匿名类实际上是类A的内部类,如第一个示例所示:理论上,语义正确吗? 到底会发生什么?我认为在编译Java文件时,将为匿名类创建一个.class文件,以便可以对其进行引用(但我找不到它)。当实例化A对象时,它创建一个按钮对象,然后btn调用addActionListener()方法,该方法实际上将类似A

  • 5.6. 匿名函数 拥有函数名的函数只能在包级语法块中被声明,通过函数字面量(function literal),我们可绕过这一限制,在任何表达式中表示一个函数值。函数字面量的语法和函数声明相似,区别在于func关键字后没有函数名。函数值字面量是一种表达式,它的值被成为匿名函数(anonymous function)。 函数字面量允许我们在使用函数时,再定义它。通过这种技巧,我们可以改写之前对st