问题是您可以使用一些可能的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 的角度来看,提供相关类的声明签名有助于解决您的问题(让它点击找到您的类正在使用,它可能不是您认为的那样)。