복붙노트

[SPRING] <S extends T> save (S 엔티티) 란 무엇을 의미합니까? Spring Repository에서?

SPRING

save (S 엔티티) 란 무엇을 의미합니까? Spring Repository에서?

Spring Data 프로젝트에서 CrudRepository는 관리되는 엔티티 클래스에 대해 정교한 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"가 의미하는 바를 알고 있습니다. 즉, 저장 작업의 반환 유형 인 S는 T의 하위 유형이어야합니다. 왜 제약 조건을 추가해야합니까? 나는 이것이 다음과 같이하는 것이 좋을 것이라고 생각한다.

T save (T entity);

에서와 같이

void delete(T entity);

나는 더 많은 도움을 찾기 위해 봤는데 stackoverflow 자체에 대한 다음 질문을 알아 냈지만 정말 나를 위해 명확하지 않습니다.

Spring CrudRepository : 새로운 제네릭 타입 S를 발명하는 이유

고맙습니다.

해결법

  1. ==============================

    1.당신이 그것을 가지고 있다면

    당신이 그것을 가지고 있다면

    T save (T entity);
    

    그런 다음 결과를 할당 할 수있는 유일한 변수는 T 유형이어야합니다.

    따라서, CrudRepository 저장소가 있고

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

    컴파일 오류가 발생합니다. 결과는 Dog에 할당 할 수 없습니다.이 유형은 T 유형 (이 경우 Animal)이어야합니다.

    반환 값이 실제로 Dog 유형인지 확인하고, 그렇다면 Dog에 캐스팅하여 savedDog에 넣어야합니다.

    선언을 그대로 사용하면 원래 인수와 동일한 유형의 변수에 값을 할당 할 수 있다는 것을 의미합니다. 유형 확인에서 허용됩니다.

    선언 그 자체는 개가 아닌 동물 부분이 저장되는 방법을 지정하지 않습니다. 그것이 원래 Dog 일 경우 결과는 Dog에 할당 할 수 있습니다.

  2. from https://stackoverflow.com/questions/41960743/what-does-it-mean-s-extends-t-save-s-entity-in-spring-repository by cc-by-sa and MIT license