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

标签 java spring generics repository spring-data

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

相关文章:

generics - 我可以使用 function.call() 调用通用函数吗?

java - static HashMap 导致内存泄漏,但是如何纠正它?

java - RecyclerView - 更改所选项目图标需要单击两次才能起作用

java - 如何在 Spring 从 Controller 中的表单获取输入日期?

Java 和泛型类型边界

spring - Resttemplate无法解析类型T的数组

java - "Update and Restart"未显示在 IntelliJ IDEA 的更新对话框中

java输入字符串并在输入 'stop'时停止

java - spring data动态组合@query查询

java - Spring Boot - 使用 s 时出现问题 :mvcUrl tag