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)?
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]. –
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
'my_collection = ArrayList;' devrait être 'my_collection = new ArrayList ();'. –
shmosel