![](/img/trans.png)
[英]Java Recursive generic template: what does this mean by … S extends Writer<E>> extends Entity<E,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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.