0

Je rencontre un problème lors de l'implémentation d'une classe abstraite. Je déclare une méthode abstraite avec List comme un paramètre dans la classe AbstractClass, mais quand je l'implémente, elle me donne des erreurs de compilation en disant que je n'ai pas implémenté correctement le résumé abstrait.Java Résumé Méthode Paramètre Type

public abstract class MyAbstractClass<T> { 
    abstract protected List<T> MyMethod(List<String> list); 
} 

public class MyClass<MyObject> extends MyAbstractClass { 
    @Override 
    protected List<MyObject> MyMethod(List<String> list){ 
     //Do Stuff 
    } 
} 

Chaque fois que je mets en œuvre ce automagiquement il fait l'List<String> juste List. Y a-t-il une raison à cela? Merci.

+2

Veuillez montrer comment vous "l'implémentez". Je suppose que vous utilisez des types bruts. –

+1

Vous voulez probablement la classe publique MyClass étend MyAbstractClass { –

Répondre

1

Je crois que ce que vous voulez est ceci:

public class MyClass extends MyAbstractClass<MyObject> { 
    @Override 
    protected List<MyObject> MyMethod(List<String> list){ 
     //Do Stuff 
    } 

} 
+0

: P Ouais c'était ça. Je ne pensais pas que cela résoudrait mon problème car il se plaignait d'un paramètre qui n'avait rien à voir avec MyObject. – CovaDax

1

Je pense que vous vouliez dire

public class MyClass extends MyAbstractClass<MyObject> 

qui utilise dire que MyClassMyObject pour le paramètre de type T.

Ce que vous avez dit est que MyClass a un paramètre de type, qui n'a aucun lien avec le paramètre de type de la classe de base T. Donc, dans ce cas, une référence MyAbstractClass pourrait pointer vers une instance MyClass, et les utilisateurs de cette référence pas besoin de savoir qu'ils ont un MyClass donc ils ne peuvent pas être contraints par T avoir à être MyClass.

0

changement à

extends MyAbstractClass<MyObject> 

testé dans Eclipse et qui fonctionne.

Il semble également logique, puisque la superclasse ne peut savoir quel type vous voulez revenir si vous donnez ce type. Et si vous ne lui donnez pas un type, il doit généraliser.

0

La question a ambiguïté si je réponds à deux cas possibles

  1. MyObject est une classe

    public class MyClass extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }

  2. Vous avez utilisé MyObject tout comme il générique et nommé comme celui-ci alors, le même type est transmis au parent comme ci-dessous

    public class MyClass<MyObject> extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }