2017-01-31 48 views
8

W projekcie Spring Data CrudRepository zapewnia zaawansowaną funkcjonalność CRUD dla zarządzanej klasy encji.Co to znaczy <S extends T> save (S entity); w 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. 
} 

W ogóle, wiem co „S rozszerza T” oznacza, że ​​to jest S, typ powrót zapisać operację, musi być podtypem T. Dlaczego jest to konieczne dodawanie takich jak ograniczenie? Myślę, że byłoby dobrze robi coś takiego:

T save (T entity); 

jak w

void delete(T entity); 

Mam google znaleźć więcej pomocy, a ja zorientowali się następujące pytanie na StackOverflow sobie, ale to isn” t naprawdę jasne dla mnie:

Spring CrudRepository: why to invent a new generic type S

dziękuję.

+2

Myślę, że masz rację. 'S' jest zbędny, a projekt sygnatury jest błędem. – ZhongYu

Odpowiedz

8

Jeśli było mieć go jako

T save (T entity); 

Wtedy jedyną zmienną można przypisać wynik musiałby być typu T.

Tak więc, jeśli masz CrudRepository<Animal,AnimalID> repository i masz

Dog dog = getDog(); 
Dog savedDog = repository.save(dog); 

Można by dostać się błąd kompilacji - nie można przypisać wynik Dog, ponieważ musi być typu T, w w tym przypadku, Animal.

Należy sprawdzić, czy zwrócona wartość rzeczywiście była typu Dog, a jeśli tak, należy ją odrzucić na Dog, aby umieścić ją w savedDog.

Przy obecnej deklaracji oznacza to, że można przypisać ją do zmiennej tego samego typu, co oryginalny argument, ponieważ pozwala na to rozdzielczość typu.

Sama deklaracja nie określa sposobu, w jaki części zwierząt bez zwierząt są zapisywane, jeśli w ogóle. Wszystko, co robi, pozwala przypisać wynik z powrotem do Dog, jeśli pierwotnie był to Dog.