繁体   English   中英

<s extends t>保存是什么意思(S实体);</s> <s extends t>在 Spring 存储库中?</s>

[英]What does it mean <S extends T> save (S entity); in Spring Repository?

在 Spring 数据项目中,CrudRepository 为正在管理的实体 class 提供复杂的 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:为什么要发明一个新的泛型 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

这是 save 方法的上限示例,而程序员可能希望使用 CrudRepository 的实现来持久化实体中的 S。 UpperBounds 限制了可以传递给 save 方法的 object 的类型,在这种情况下,T 是 CrudRepository 的实例类型,这意味着只有 CrudRepository 的子或实现可以用作 S。

这篇文章突出了错误,但这篇文章显示错误描述,清楚地讲述了这个故事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM