Java: Como substituir esse método genérico?
public <S extends T> List<S> save(Iterable<S> entities) {
//...
}
Se eu usar o seguinte método para substituir
@Override
public List<MyType> save(Iterable<MyType> structures) {
List<MyType> result = new ArrayList<>();
//...
return result;
}
Eu recebo seguinte erro:
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
Como posso resolver isso? Eu não preciso que o método seja genérico e, na verdade, não deveria ser. O que quero dizer é que
@Override
public <S extends MyType> List<S> save(Iterable<S> structures) {
List<S> result = new ArrayList<>();
//...
return result;
}
Não funcionará, pois o método pode criar um novo Objeto do MyType que não é "compatível" com o List.
Como posso fazer isso funcionar?
EDITAR:
Para esclarecimento. Estou tentando substituir os diferentes métodos save () dos dados Spring SimpleJpaRepository (que é estendido por QuerydslJpaRepository)
Definições de classe:
public class MyTypeRepositoryImpl
extends QueryDslJpaRepository<MyType, Long>
implements MyTypeRepository
@NoRepositoryBean
public interface MyTypeRepository
extends JpaRepository<MyType, Long>,
QueryDslPredicateExecutor<MyType>
E isso (da Spring Data)
public class QueryDslJpaRepository<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID>
implements QueryDslPredicateExecutor<T>
EDIT 2:
O método chama save (entidade MyType) para cada elemento e esse método contém a seguinte lógica:
entidade tem um campo que é únicoobtenha esse valor de campos e verifique se a entidade com esse valor já existese sim, use essa entidade (chamada para entityManager.merge) -> não funciona retorna MyType não Sse não criar um novo -> aqui novo objeto é criado. Não funciona com tipo genéricoPara 4. Eu posso apenas definir id = null e usar o objeto passado. Isso não funciona para 3.
Então estou muito confuso porque esse método tem essa assinatura. Isso torna inutilizável para mim e eu não entendo porque eu salvaria uma subclasse de T usando Ts DAO. Os métodos de salvaguarda são os únicos com. Todos os outros apenas usam T. Eu poderia apenas converter para S para compilar, mas isso também parece feio ... como qualquer outro tipo de T levaria a uma exceção.