2016-06-09 2 views
-1

Cela fait quelques années que j'ai programmé en Java, j'ai donc décidé de consulter une ancienne source fiable. Dans "Introduction à la programmation Java" par Liang, p. 798, un ArrayList est prévu comme ceci:Initialisation de la collection générique

Collection<String> collection = new ArrayList<String>(); 

L'auteur passe ensuite sur l'utilisation (uniquement) la méthode add() et crée une utilise un Iterator de collection. Maintenant, j'aime utiliser une déclaration de classe générique autant que possible (venant de, maintenant, un fond C et C++) parce que si je change d'avis sur le type que je veux utiliser pour une solution, je peux changer une seule ligne de code. Idéalement, je serais capable de déclarer un Collection<some_type> my_collection (qu'il s'agisse d'un membre ou d'une variable locale), et plus tard de le définir comme n'importe quel type qui étend la classe Collection.

Mais, lorsque je tente de faire ce qui suit,

Collection<String> my_collection; 

, puis plus tard,

my_collection = ArrayList<String>(); 

Je reçois des erreurs de compilation: à savoir, le compilateur ne peut pas trouver les get() et remove() symboles (ou au moins pas les versions des méthodes surchargées que je croient que j'appelle). Par exemple,

[...].java:48: error: incompatible types: boolean cannot be converted to Process 
     otherAlg.addJob(wait_queue.remove(0)); 
             ^

REMARQUE: le type Processus est "entièrement vérifié" et ne constitue pas le problème ici.

En outre,

[...].java:72: error: cannot find symbol 
     return wait_queue.get(0); 
         ^

Bien sûr: je peux « régler » le problème en déclarant quel type je vais initialiser en premier lieu, mais quel est le problème? Pourquoi l'incohérence entre ce que Liang énonce et ce que je suppose être possible, et ce qui est réellement pratique (du moins en ce qui concerne mon compilateur)?

+3

Quel est le type de retour de 'remove (int)'? Qu'est-ce que cela a à voir avec l'original 'Collection '? Qu'est-ce que 'wait_queue'? Votre question est partout pour le moment. Veuillez clarifier et fournir un [MCVE]. –

+0

Le type de compilation de my_collection est [Collection] (http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html), qui n'a ni méthode get ni remove (int) méthode. Le fait que vous l'avez initialisé à un ArrayList est sans importance; le type de la variable est mémorisé uniquement en tant que collection, en ce qui concerne le compilateur.En cas de doute, lisez la documentation officielle; en Java, les docs ne sont pas seulement pour l'assistance, ils sont la loi. – VGR

+0

'my_collection = ArrayList ;' devrait être 'my_collection = new ArrayList ();'. – shmosel

Répondre

1

En ce qui concerne le reste de votre programme est au courant de votre wait_queue est juste un Collection, il n'a pas get ou remove méthodes.

Vous avez raison de ne pas associer votre implémentation au type de la variable, mais vous ne devez pas utiliser Collection à moins que vous ne souhaitiez que parcourir le contenu. Utilisez List, Set ou d'autres interfaces de collections pour décrire des collections. Ceux-ci exposent les méthodes get et remove (dans le cas des méthodes List) que vous souhaitez, et exposent le comportement de l'objet (mais pas l'implémentation - dans ce cas ArrayList). par exemple, un List permet des doublons alors qu'un Set ne le fait pas.

+1

La collection a réellement des méthodes de suppression – ControlAltDel

+0

@ControlAltDel Droite: juste pas les surcharges que j'attends qui appartiennent à 'ArrayList'. – JDQ

+0

D'accord, je vois ça maintenant. Merci d'avoir répondu. – JDQ