Java: Jak zastąpić tę ogólną metodę?
public <S extends T> List<S> save(Iterable<S> entities) {
//...
}
Jeśli użyję następującej metody, aby nadpisać
@Override
public List<MyType> save(Iterable<MyType> structures) {
List<MyType> result = new ArrayList<>();
//...
return result;
}
Otrzymuję następujący błąd:
method does not override or implement a method from a supertype
name clash: save(Iterable<MyType>) in MyTypeRepositoryImpl and <S>save(Iterable<S>) in SimpleJpaRepository have the same erasure, yet neither overrides the other
where S,T are type-variables:
S extends T declared in method <S>save(Iterable<S>)
T extends Object declared in class SimpleJpaRepository
Jak mogę to rozwiązać? Nie potrzebuję metody, aby była ogólna, a tak naprawdę nie powinna. Mam na myśli to
@Override
public <S extends MyType> List<S> save(Iterable<S> structures) {
List<S> result = new ArrayList<>();
//...
return result;
}
Nie będzie działać, ponieważ metoda może utworzyć nowy obiekt MyType, który nie jest „zgodny” z listą.
Jak mogę to zrobić?
EDYTOWAĆ:
Dla wyjaśnienia. Usiłuję przesłonić różne metody save () danych SpringJpaRepository (które są rozszerzone przez QuerydslJpaRepository)
Definiowanie klas:
public class MyTypeRepositoryImpl
extends QueryDslJpaRepository<MyType, Long>
implements MyTypeRepository
@NoRepositoryBean
public interface MyTypeRepository
extends JpaRepository<MyType, Long>,
QueryDslPredicateExecutor<MyType>
A to (z Spring Data)
public class QueryDslJpaRepository<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID>
implements QueryDslPredicateExecutor<T>
EDYCJA 2:
Wywołania metody save (MyType entity) dla każdego elementu i ta metoda zawiera następującą logikę:
podmiot ma unikalne polepobierz wartości pól i sprawdź, czy jednostka o tej wartości już istniejejeśli tak, użyj tej encji (wywołanie entityManager.merge) -> nie działa zwraca MyType nie Sjeśli nie utworzysz nowego -> tutaj tworzony jest nowy obiekt. Nie działa z typem ogólnymDla 4. Mogę po prostu ustawić id = null i użyć przekazanego obiektu. To nie działa dla 3.
Jestem więc bardzo zdziwiony, dlaczego ta metoda ma ten podpis. To sprawia, że jest dla mnie bezużyteczny i nie rozumiem dlaczego zapisałbym podklasę T używając Ts DAO. jedynymi metodami zapisu są metody zapisu. Wszystkie inne używają po prostu T. Mogłem po prostu rzucić na S, aby go skompilować, ale to też wydaje się brzydkie ... jak każdy inny typ niż T doprowadziłby do wyjątku.