J'utilise Java sur Debian 5
Version Java "1.6.0_20"
Environnement d'exécution Java SE (version 1.6.0_20-b02)
Client Java HotSpot (TM) VM (version 16.3-b01, mode mixte, partage)
Pourquoi y a-t-il une différence entre ce qui suit
Cas 1:
import Java.util.*;
Cas 2:
import Java.util.*;
import Java.util.Arrays;
import Java.util.List;
Pourquoi le premier cas ne couvre-t-il pas le second?
Le code ne se compile que lorsque j'importe explicitement des tableaux et des listes.
Code:
import Java.util.*;
import Java.util.Arrays;
import Java.util.List;
public class Test {
public static void main (String[] args) {
List<Integer> i = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
List<Integer> j = new ArrayList();
ListIterator<Integer> n = i.listIterator(i.size());
while(n.hasPrevious()) {
j.add(n.previous());
}
println(j);
}
static void println(Object o) {
System.out.println(o);
}
static void print(Object o) {
System.out.print(o);
}
}
L'erreur que je reçois lorsque je commente les deuxième et troisième déclarations d'importation est la suivante:
nattyp@debian:~/dev/Java$ javac Test.Java
Test.Java:7: cannot find symbol
symbol : method asList(int,int,int,int,int,int,int,int,int,int)
location: class Arrays
List<Integer> i = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
^
Note: Test.Java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
nattyp@debian:~/dev/Java$
Je viens de le compiler et il compile très bien sans l'importation implicite, probablement que vous voyez un cache obsolète ou quelque chose de votre IDE.
Avez-vous essayé de compiler à partir de la ligne de commande?
J'ai la même version exacte:
Vous pensez probablement que l'avertissement est une erreur.
METTRE &AGRAVE; JOUR
Il semble que vous ayez un fichier Arrays.class
dans le répertoire où vous essayez de compiler (probablement déjà créé). C'est pourquoi l'importation explicite résout le problème. Essayez de copier votre code source dans un nouveau répertoire propre et essayez à nouveau. Vous verrez qu'il n'y a pas d'erreur cette fois-ci. Ou nettoyez votre répertoire de travail et supprimez le Arrays.class
La différence entre
import Java.util.*;
et
import Java.util.*;
import Java.util.List;
import Java.util.Arrays;
devient apparent lorsque le code fait référence à une autre List
ou Arrays
(par exemple, dans le même package, ou également importé en général). Dans le premier cas, le compilateur supposera que la variable Arrays
déclarée dans le même package est celle à utiliser, dans ce dernier cas, puisqu'elle est déclarée spécifiquement, le plus spécifique Java.util.Arrays
sera utilisé.
Le cas 1 aurait dû fonctionner. Je ne vois rien de mal. Il peut y avoir d'autres problèmes. Je suggérerais une construction propre.
Jetez un oeil à ce forum http://htmlcoderhelper.com/why-is-using-a-wild-card-with-a-Java-import-statement-bad/ . Une discussion sur la manière dont l’utilisation de caractères génériques peut entraîner des conflits si vous ajoutez de nouvelles classes aux packages et s’il existe deux classes portant le même nom dans des packages différents et qu’une seule d’elles soit importée.
List<Integer> i = new ArrayList<Integer>(Arrays.asList(0,1,2,3,4,5,6,7,8,9,10));
List<Integer> j = new ArrayList<Integer>();
Vous devez spécifier le type de la liste de tableaux, sinon le compilateur donnera cet avertissement, car il ne peut pas indiquer que vous utilisez la liste de manière sécurisée.