我试图创建一个这样的事件监听器:
@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的角度来看,提供相关类的声明签名会很有帮助(单击它可以找到您正在使用的类,它可能不是您认为的那种)。