2017-01-31 3 views
8

In Spring Data Projekt bietet das CrudRepository komplexe CRUD-Funktionalität für die Entity-Klasse, die verwaltet wird.Was bedeutet <S extends T> speichern (S-Entität); im Frühjahrsspeicher?

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. 
} 

Im Allgemeinen weiß ich, was bedeutet „S T erweitert“, das heißt, die S, der Rückgabetyp der Operation speichern, muß Subtyp von T. sein, warum es notwendig ist, als Zwang fügen solche? Ich denke, dass wäre schön, etwas zu tun wie folgt aus:

T save (T entity); 

Wie in

void delete(T entity); 

Ich habe gegoogelt mehr Hilfe zu finden, und ich habe auf Stackoverflow selbst folgende Frage herausgefunden, aber es isn‘ t wirklich für mich klar:

Spring CrudRepository: why to invent a new generic type S

danke.

+2

Ich denke, du hast Recht. "S" ist überflüssig und das Design der Signatur ist ein Fehler. – ZhongYu

Antwort

8

Wenn Sie es als

T save (T entity); 

Dann ist die einzige Variable haben sind, können Sie das Ergebnis zuordnen würde haben T Typen sein.

Also, wenn Sie einen CrudRepository<Animal,AnimalID> repository haben, und Sie haben

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

Sie einen Compiler-Fehler erhalten würde - das Ergebnis zu Dog nicht zuordnen können, wie es der Typ sein, hat T, in dieser Fall, Animal.

Sie benötigen würden, wenn der zurückgegebene Wert in der Tat von Dog Typ war zu überprüfen, und wenn ja, muss er in Dog es in savedDog zu setzen.

Mit der Deklaration, so wie sie ist, können Sie sie einer Variablen des gleichen Typs wie das ursprüngliche Argument zuweisen, da die Typauflösung dies zulässt.

Die Deklaration selbst gibt nicht an, wie die nicht-animalischen Teile des Hundes wenn überhaupt gespeichert werden. Es ist nur möglich, das Ergebnis zurück zu Dog zuzuordnen, wenn es ursprünglich ein Dog war.