public <S extends T> List<S> save(Iterable<S> entities) {
//...
}
jeśli mogę użyć następującą metodę, aby zastąpićJava: Jak zastąpić tę ogólną metodę?
@Override
public List<MyType> save(Iterable<MyType> structures) {
List<MyType> result = new ArrayList<>();
//...
return result;
}
dostaję 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ę rozwiązać ten problem? Nie potrzebuję tej metody, aby była ogólna i tak naprawdę nie powinna być. Chodzi mi o to, że
@Override
public <S extends MyType> List<S> save(Iterable<S> structures) {
List<S> result = new ArrayList<>();
//...
return result;
}
nie będzie działać zgodnie z metodą można utworzyć nowy obiekt z MyType który nie jest „kompatybilna” do listy.
Jak mogę to ułatwić?
EDYTOWANIE:
W celu wyjaśnienia. Próbuję zastępują różne save() metody danych wiosennym SimpleJpaRepository (który jest oporny przez QuerydslJpaRepository)
defintions Klasa:
public class MyTypeRepositoryImpl
extends QueryDslJpaRepository<MyType, Long>
implements MyTypeRepository
@NoRepositoryBean
public interface MyTypeRepository
extends JpaRepository<MyType, Long>,
QueryDslPredicateExecutor<MyType>
I (od wiosny Danych)
public class QueryDslJpaRepository<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID>
implements QueryDslPredicateExecutor<T>
EDYCJA 2:
Metoda wywołuje zapis (element MyType) dla każdego elementu i ta metoda zawiera następującą logikę:
- jednostka ma pole, które jest unikalne
- get że pola wartości i sprawdzić, czy podmiot z tej wartości już istnieje
- jeśli tak, należy ten podmiot (wezwanie do EntityManager.merge) -> nie działa powraca MyType nie S
- jeśli nie utworzysz nowego -> tutaj tworzony jest nowy obiekt. Nie działa z typowym typem:
Dla 4. Mogę ustawić id = null i użyć przekazanego obiektu. To nie działa dla 3.
Więc jestem bardzo zdziwiony, dlaczego ta metoda ma ten podpis. To czyni go bezużytecznym dla mnie i nie rozumiem dlaczego zapisałbym podklasę T używając Ts DAO. metody zapisu są jedynymi, z którymi. Wszyscy inni po prostu używają T. Mogłem po prostu rzucić na S, aby go skompilować, ale to też wydaje się brzydkie ... jak każdy inny typ niż T, prowadziłby do wyjątku.
W jaki sposób deklarowane są klasy zawierające? – assylias
co masz na myśli, mówiąc, że nie jest "zgodny" z listą? Wygląda na to, że z oryginalnego parametru '
' klasa jest stworzona tak, aby można jej było używać, wykonując coś w rodzaju 'implementuje InterfaceName' bez konieczności mieszania się z podklasą –
Od komentarzy do innych odpowiedzi i faktu, że jesteś rozszerzając klasę, nad którą nie masz kontroli, wierzę, że jesteś zmuszony do użycia 'public
Listsave (Iterablestruktur)'. Dzieje się tak dlatego, że zastąpiona metoda jest generyczna, a więc musi być również metoda overridding. –