Spring CrudRepository 同擦除
Spring CrudRepository same erasure
我有自己的自定义存储库,但是当我尝试 override/use CrudRepository 时,它给我“两种方法具有相同的擦除,但都没有覆盖另一个”。请看下面。
public interface MyRepository extends CrudRepository<Person, String> {
//<S extends T> S save(S entity); //Parent method
Person save(Person person);//It accepts this
//<S extends T> Iterable<S> saveAll(Iterable<S> entities);//Parent method
Iterable<Person> saveAll(Iterable<Person> persons);//But does not accept this. why can I not use/override this?
//This Gives error "both methods have same erasure, yet neither overrides the other"
}
Java 泛型通过称为擦除的概念工作,这意味着在引擎盖下所有泛型都会转换为 <Object>
。不幸的是,这是 Java 的限制之一,确保它与 Java 5 和泛型之前编写的代码向后兼容。
编译器发现这两个方法具有相同的名称和相同的参数。
只需将其中一种方法的名称从 saveAll
更改为 saveAllPeople
或其他名称即可。
我有自己的自定义存储库,但是当我尝试 override/use CrudRepository 时,它给我“两种方法具有相同的擦除,但都没有覆盖另一个”。请看下面。
public interface MyRepository extends CrudRepository<Person, String> {
//<S extends T> S save(S entity); //Parent method
Person save(Person person);//It accepts this
//<S extends T> Iterable<S> saveAll(Iterable<S> entities);//Parent method
Iterable<Person> saveAll(Iterable<Person> persons);//But does not accept this. why can I not use/override this?
//This Gives error "both methods have same erasure, yet neither overrides the other"
}
Java 泛型通过称为擦除的概念工作,这意味着在引擎盖下所有泛型都会转换为 <Object>
。不幸的是,这是 Java 的限制之一,确保它与 Java 5 和泛型之前编写的代码向后兼容。
编译器发现这两个方法具有相同的名称和相同的参数。
只需将其中一种方法的名称从 saveAll
更改为 saveAllPeople
或其他名称即可。