Java: ¿Cómo anular este método genérico?
public <S extends T> List<S> save(Iterable<S> entities) {
//...
}
Si utilizo el siguiente método para anular
@Override
public List<MyType> save(Iterable<MyType> structures) {
List<MyType> result = new ArrayList<>();
//...
return result;
}
Me sale el siguiente error:
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 puedo resolver esto? No necesito que el método sea genérico y, de hecho, no debería serlo. Lo que quiero decir es que
@Override
public <S extends MyType> List<S> save(Iterable<S> structures) {
List<S> result = new ArrayList<>();
//...
return result;
}
No funcionará ya que el método puede crear un nuevo Objeto de MiTipo que no es "compatible" con la Lista.
¿Cómo puedo hacer que esto funcione?
EDITAR:
Para aclaraciones. Estoy intentando anular los diferentes métodos save () de los datos de Spring SimpleJpaRepository (que está ampliado por QuerydslJpaRepository)
Definiciones de clase:
public class MyTypeRepositoryImpl
extends QueryDslJpaRepository<MyType, Long>
implements MyTypeRepository
@NoRepositoryBean
public interface MyTypeRepository
extends JpaRepository<MyType, Long>,
QueryDslPredicateExecutor<MyType>
Y esto (de Spring Data)
public class QueryDslJpaRepository<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID>
implements QueryDslPredicateExecutor<T>
EDIT 2:
El método llama a guardar (entidad MyType) para cada elemento y ese método contiene la siguiente lógica:
entidad tiene un campo que es únicoobtener el valor de los campos y verificar si la entidad con ese valor ya existeSi es así, use esa entidad (llamada a entityManager.merge) -> no funciona devuelve MyType no SSi no crea uno nuevo -> aquí se crea un nuevo objeto. No funciona con tipo genérico.Para 4. Simplemente puedo establecer id = null y usar el objeto pasado. Eso no funciona para 3.
Así que estoy muy sorprendido de por qué este método tiene esta firma. Lo hace inutilizable para mí y no entiendo por qué guardaría una subclase de T usando Ts DAO. Los métodos de guardar son los únicos con. Todos los demás solo usan T. Puedo lanzar a S para hacerlo compilar, pero eso también parece feo ... ya que cualquier otro tipo que no sea T daría lugar a una excepción.