What does it mean lt;S extends Tgt; save (S entity); in Spring Repository?(lt;S 扩展 Tgt; 是什么意思保存(S实体);在 Spring 存储库中?)
问题描述
在 Spring Data 项目中,CrudRepository 为正在管理的实体类提供复杂的 CRUD 功能.
In Spring Data project the CrudRepository provides sophisticated CRUD functionality for the entity class that is being managed.
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的子类型.为什么要加上这样的约束?我认为这样做会很好:
In general, I know what "S extends T" means, i.e. that S, the return type of save operation, must be subtype of T. Why is it necessary to add such as constraint? I think that would be fine doing something like this:
T save (T entity);
如
void delete(T entity);
我在谷歌上搜索以寻求更多帮助,我发现了关于 stackoverflow 本身的以下问题,但对我来说并不是很清楚:
I've googled to find more help and I've figured out following question on stackoverflow itself but it isn't really clear for me:
Spring CrudRepository:为什么要发明一个新的泛型S型
谢谢.
推荐答案
如果你想拥有它
T save (T entity);
那么您可以将结果分配给的唯一变量必须是 T
类型.
Then the only variable you could assign the result to would have to be of type T
.
所以,如果你有一个 CrudRepository<Animal,AnimalID>存储库
,你有
So, if you have a CrudRepository<Animal,AnimalID> repository
, and you have
Dog dog = getDog();
Dog savedDog = repository.save(dog);
你会得到一个编译错误 - 你不能将结果分配给 Dog
,因为它必须是 T
类型,在这种情况下,动物
.
You'd get a compile error - you can't assign the result to Dog
, as it has to be of type T
, in this case, Animal
.
您需要检查返回的值是否确实是 Dog
类型,如果是,则将其转换为 Dog
以将其放入 savedDog代码>.
You'd need to check if the returned value was indeed of type Dog
, and if so, cast it to Dog
to put it in savedDog
.
按照原样声明,这意味着您可以将其分配给与原始参数相同类型的变量,因为类型解析将允许这样做.
With the declaration as it is, it means that you can assign it to a variable of the same type as the original argument, as type resolution will allow that.
声明本身并没有具体说明如何保存狗的非动物部分(如果有的话).它所做的只是允许将结果分配回 Dog
如果它最初是 Dog
.
The declaration itself doesn't specify how the non-animal parts of the dog are saved if at all. All it does is allow assigning the result back to a Dog
if it was originally a Dog
.
这篇关于<S 扩展 T> 是什么意思保存(S实体);在 Spring 存储库中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:<S 扩展 T> 是什么意思保存(S实体);在 Spring 存储库中?
基础教程推荐
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- 降序排序:Java Map 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01