Java: как переопределить этот универсальный метод?
public <S extends T> List<S> save(Iterable<S> entities) {
//...
}
Если я использую следующий метод для переопределения
@Override
public List<MyType> save(Iterable<MyType> structures) {
List<MyType> result = new ArrayList<>();
//...
return result;
}
Я получаю следующую ошибку:
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
Как я могу решить это? Мне не нужен метод, чтобы быть универсальным, и на самом деле это не должно быть. Я имею в виду, что
@Override
public <S extends MyType> List<S> save(Iterable<S> structures) {
List<S> result = new ArrayList<>();
//...
return result;
}
Не будет работать, так как метод может создать новый объект MyType, который не «совместим» с List.
Как я могу сделать эту работу?
РЕДАКТИРОВАТЬ:
В целях разъяснения. Я пытаюсь переопределить различные методы save () данных Spring SimpleJpaRepository (который расширяется QuerydslJpaRepository)
Определения класса:
public class MyTypeRepositoryImpl
extends QueryDslJpaRepository<MyType, Long>
implements MyTypeRepository
@NoRepositoryBean
public interface MyTypeRepository
extends JpaRepository<MyType, Long>,
QueryDslPredicateExecutor<MyType>
И это (из Spring Data)
public class QueryDslJpaRepository<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID>
implements QueryDslPredicateExecutor<T>
РЕДАКТИРОВАТЬ 2:
Метод вызывает save (MyType entity) для каждого элемента, и этот метод содержит следующую логику:
сущность имеет поле, которое является уникальнымполучить значение этого поля и проверить, существует ли сущность с таким значениемесли да, используйте эту сущность (вызов entityManager.merge) -> не работает, возвращает MyType, а не Sесли нет создать новый -> здесь новый объект создается. Не работает с универсальным типомДля 4. Я могу просто установить id = null и использовать переданный объект. Это не работает для 3.
Поэтому я очень озадачен, почему этот метод имеет эту подпись. Это делает его непригодным для меня, и я не понимаю, почему я бы сохранил подкласс T, используя Ts DAO. Методы сохранения являются единственными с. Все остальные просто используют T. Я мог бы просто привести к S, чтобы он компилировался, но это тоже выглядит ужасно ... так как любой другой тип, кроме T, приведет к исключению.