Java:Comment faire pour remplacer cette méthode générique?

public <S extends T> List<S> save(Iterable<S> entities) {
        //...
}

Si j'utilise la méthode suivante pour remplacer

@Override
public List<MyType> save(Iterable<MyType> structures) {
    List<MyType> result = new ArrayList<>();
    //...
    return result;
}

J'obtiens l'erreur suivante:

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

Comment puis-je résoudre ce problème? Je n'ai pas besoin de la méthode générique et en fait, il ne devrait pas être. Ce que je veux dire, c'est que

@Override
public <S extends MyType> List<S> save(Iterable<S> structures) {
    List<S> result = new ArrayList<>();
    //...
    return result;
}

Ne fonctionnera pas, car la méthode permet de créer un nouvel Objet de MyType qui n'est pas "compatible" à la Liste.

Comment puis-je faire ce travail?

EDIT:

Pour obtenir des éclaircissements. Je suis en train de remplacer les différents save() les méthodes de Printemps de données SimpleJpaRepository (qui est étendu par QuerydslJpaRepository)

Classe definitions:

public class MyTypeRepositoryImpl
    extends QueryDslJpaRepository<MyType, Long>
    implements MyTypeRepository

@NoRepositoryBean
public interface MyTypeRepository
    extends JpaRepository<MyType, Long>,
    QueryDslPredicateExecutor<MyType> 

Et ce (à partir du Printemps de Données)

public class QueryDslJpaRepository<T, ID extends Serializable> 
extends SimpleJpaRepository<T, ID> 
implements QueryDslPredicateExecutor<T>

EDIT 2:

Les appels à la méthode save(MyType entité) pour chaque élément et que la méthode contient logique suivante:

  1. entité a un champ qui est unique
  2. obtenir que les champs de la valeur et de vérifier si l'entité avec la valeur existe déjà
  3. si oui, utiliser cette entité (appel à l'entityManager.de fusion) -> ne fonctionne pas retourne MyType pas S
  4. si pas d'en créer un nouveau -> ici nouvel objet est créé. Ne fonctionne pas avec le type générique

Pour 4 personnes. Je peux juste set id = null et l'utilisation du passé dans l'objet. Cela ne fonctionne pas pour 3.

Donc je suis très perplexe pourquoi cette méthode a cette signature. Il le rend inutilisable pour moi et je ne comprends pas pourquoi je voudrais enregistrer une sous-classe de T en utilisant Ts DAO. les méthodes enregistrer sont les seuls avec . Tous les autres n'utilisent T. je pourrais les jeter à S de faire de la compilation, mais qui semble moche...comme n'importe quel autre type de T conduirait à une exception.

Comment sont les contenant les classes déclarées?
qu'entendez-vous par pas "compatible" à la Liste? Il ressemble à de l'original <S extends T> paramètre de la classe est faite pour pouvoir être utilisé en faisant quelque chose comme implements InterfaceName<MyType> sans avoir à muck autour avec un sous-classement
À partir des commentaires à d'autres réponses et le fait que vous êtes à l'extension d'une classe sur laquelle vous n'avez aucun contrôle, je crois que vous êtes contraint d'utiliser public <S extends MyType> List<S> save(Iterable<S> structures). C'est parce que la méthode de remplacement est généricisés et donc la overridding méthode doit l'être également.

OriginalL'auteur beginner_ | 2012-10-24