为什么@Autowired不适用于通用类型T?

时间:2020-04-03 18:56:51

标签: java spring generics spring-data-jpa

我在下面的课程中尝试注入一些JpaRepository依赖项。

class Sample<T> implements SampleInterface<T> {
  @Autowired
  JpaRepository<T, Long> jpaRepository; // Want this to be injected by spring using A as entity
}


 class Main {
    @Bean
    Sample<A> sample() {
      return new Sample<A>(); // A is a jpa entity
    }
 }

是因为在编译过程中解析了注解吗?为什么不能使用泛型使spring自动布线自动化?我可能会错过基本知识,但想填补这一知识空白。

1 个答案:

答案 0 :(得分:2)

其原因是类型擦除,它在编译时发生,而bean注入在运行时发生。

由于没有限制,T被擦除并基本上由Object取代,并且Spring Data无法为Object创建存储库。

另请参阅Using generics in Spring Data JPA repositories