在 Spring Data 项目中,CrudRepository 为正在管理的实体类提供复杂的 CRUD 功能。
public interface CrudRepository<T, ID extends Serializable>
extends Repository<T, ID> {
<S extends T> S save(S entity);
T findOne(ID primaryKey);
Iterable<T> findAll();
Long count();
void delete(T entity);
boolean exists(ID primaryKey);
// … more functionality omitted.
}
一般来说,我知道“S extends T”是什么意思,即save操作的返回类型S必须是T的子类型。为什么要加上这样的约束?我认为这样做会很好:
T save (T entity);
如
void delete(T entity);
我在谷歌上搜索以寻求更多帮助,我发现了关于 stackoverflow 本身的以下问题,但对我来说并不是很清楚:
Spring CrudRepository: why to invent a new generic type S
谢谢。
最佳答案
如果你想拥有它
T save (T entity);
那么您可以将结果分配给的唯一变量必须是 T
类型。 .
所以,如果您有 CrudRepository<Animal,AnimalID> repository
,你有
Dog dog = getDog();
Dog savedDog = repository.save(dog);
你会得到一个编译错误 - 你不能将结果分配给 Dog
,因为它必须是 T
类型,在这种情况下,Animal
.
您需要检查返回的值是否确实是 Dog
类型,如果是,将其转换为 Dog
放入savedDog
.
按照原样声明,这意味着您可以将其分配给与原始参数相同类型的变量,因为类型解析将允许这样做。
声明本身并没有具体说明如何保存狗的非动物部分(如果有的话)。它所做的只是允许将结果分配回 Dog
如果它最初是 Dog
.
关于java - <S extends T> 是什么意思保存(S实体);在 Spring 存储库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41960743/