我试图创建一个这样的事件监听器:

@Bean
open fun beforeSaveEventApplicationListener(): ApplicationListener<BeforeSaveEvent>
{
   return ApplicationListener<BeforeSaveEvent>()
   {
       fun onApplicationEvent(event: BeforeSaveEvent)
       {
           //Do something with event
       }
   }
}


。 。 。但不会编译。在指定泛型类型的地方,编译器返回:

Type argument expected


我究竟做错了什么?

最佳答案

问题是您可能正在使用几个可能的BeforeSaveEvent类。以下是一些模拟出来的Spring类,以显示差异(请注意两个BeforeSaveEvent声明):



open class ApplicationEvent(source: Any): EventObject(source) {}

interface ApplicationListener<T: ApplicationEvent> {
    fun onApplicationEvent(event: T)
}

// the Spring Data Neo4j version requires a type
class BeforeSaveEvent<T>(source: Any, val entity: T): ApplicationEvent(source) {}

// the Spring data version does not
class BeforeSaveEvent(source: Any): ApplicationEvent(source) {}


因此,如果您编码为Spring数据版本,则代码如下:

open class Something {
    open fun beforeSaveEventApplicationListener(): ApplicationListener<BeforeSaveEvent> {
        return object : ApplicationListener<BeforeSaveEvent> {
            override fun onApplicationEvent(event: BeforeSaveEvent) {
                //Do something with event
            }
        }
    }
}


如果您编码为Neo4j版本(我想是因为您的问题标记包括spring-data-neo4j-4),则还必须指定实体类型参数:

class MyEntity {}

open class Something {
    open fun beforeSaveEventApplicationListener(): ApplicationListener<BeforeSaveEvent<MyEntity>> {
        return object : ApplicationListener<BeforeSaveEvent<MyEntity>> {
            override fun onApplicationEvent(event: BeforeSaveEvent<MyEntity>) {
                //Do something with event
            }
        }
    }
}


因此,您可以确切地看到编译器的要求:


  请给我BeforeSaveEvent的类型参数,因为它确实是BeforeSaveEvent<T>


可能是因为您导入了错误的类并表示另一个BeforeSaveEvent,或者是您导入了正确的BeforeSaveEvent<T>而没有适应其实际的泛型类型参数需求。

同样,由于ApplicationListener是接口,所以在使用()后不希望使用它,因为这意味着您正在尝试在接口上调用构造函数。

注意:从IDE的角度来看,提供相关类的声明签名会很有帮助(单击它可以找到您正在使用的类,它可能不是您认为的那种)。

09-27 14:29