gpt4 book ai didi

java - 是什么意思保存(S实体);在 Spring 存储库中?

转载 作者:IT老高 更新时间:2023-10-28 13:49:15 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com