11
votes

Extension de la classe abstraite générique et une utilisation correcte de Super

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?

0 commentaires

3 Réponses :


19
votes
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.

1 commentaires

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 étend abstracttool . Cela serait équivalent fonctionnellement depuis la définition de AbstractTool vous empêcherait d'utiliser un paramètre générique qui n'était pas un absacthing .



3
votes

ne devrait-il pas être plutôt outil étend abstracttool ?


0 commentaires

0
votes

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 ...
    }


2 commentaires

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.