2017-01-31 57 views
8

在Spring Data項目中,CrudRepository爲正在管理的實體類提供了複雜的CRUD功能。這是什麼意思<S extends T> save(S entity);在Spring Repository中?

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伸展T」的手段,即是S,保存操作的返回類型,必須是T的子類型爲什麼需要添加諸如約束?我認爲這將是罰款做這樣的事情:

T save (T entity); 

正如

void delete(T entity); 

我GOOGLE找到更多的幫助,我已經想通了以下的計算器本身的問題,但它不是」噸我真的很明確:

Spring CrudRepository: why to invent a new generic type S

謝謝。

+2

我認爲你是對的。 'S'是多餘的,簽名設計是一個錯誤。 – ZhongYu

回答

8

如果你把它作爲

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

相關問題