public abstract class AbstractTool<AT extends AbstractThing> { protected ArrayList<AT> ledger; public AbstractTool() { ledger = new ArrayList<AT>(); } public AT getToolAt(int i) { return ledger.get(i); } // More code Which operates on Ledger ... } public class Tool<AT extends AbstractThing> extends AbstractTool { public Tool() { super(); } } How do I correctly call super to pass the AT generic of Tool to the AbstractTool constructor?It seems no matter what I pick AT to be when I declare Tool (Say, Tool<Thing>), that I always get back an AbstractThing instead of Thing. This seems to defeat the purpose of generics...Help?
3 Réponses :
public class Tool<AT extends AbstractThing> extends AbstractTool<AT> { In other words, if you extend or implement something with generics, remember to define the generics arguments for them.
En fait, dans ce cas, car les contraintes de type sur le paramètre générique d'AbstractTool seront héritées, vous pouvez simplement écrire l'outil de classe public
absacthing code>.
ne devrait-il pas être plutôt
outil
Je pense que ce que vous voulez probablement est:
public abstract class AbstractTool<AT extends AbstractThing> { protected List<AT> ledger = new ArrayList<AT>(); public AT getToolAt(int i) { return ledger.get(i); } // More code Which operates on Ledger ... } public class Tool extends AbstractTool<Thing> { // Tool stuff ... }
Les chattes sont en fait quelques occasions où il est très utile d'avoir des paramétrisations de classes en béton. ArrayList, LinkedList, HASHMAP, HASHSET, Tous sont paramétrés, et toutes sont également des classes concrètes.
Je n'ai pas dit qu'il n'y avait pas. Mais il simplifie énormément le code client si vous n'êtes pas obligé. Les classes de type conteneur ont évidemment besoin de types de béton paramétrés, et peut-être que je lisais trop dans l'exemple minimal, mais je ne pensais pas que le Op l'avait requis.