4 votes

Syntaxe de la boucle for-each

Quelqu'un peut-il me dire ce qui se passe ici? Il me semble que myObj est casté en String[] pour pouvoir être itéré dans la boucle for. Mais il a été construit comme new String[] -- pourquoi doit-il être casté?

public static void main(String args[]) {
  Object myObj = new String[]{"one", "two", "three"};
  for (String s : (String[])myObj) {
      System.out.print(s + ".");
  }
}

Merci!

5voto

Oli Charlesworth Points 148744

Peu importe qu'il soit créé en tant que String[]; vous avez seulement une référence Object vers elle. Cela n'a rien à voir avec la boucle for-each; la manip suivante ne compilerait pas non plus:

Object myObj = new String[]{"un", "deux", "trois"};
System.out.println(myObj.length);  // Il n'y a pas de Object.length

2voto

ibid Points 2837

Lorsque vous avez déclaré myObj comme Object, vous lui avez dit d'oublier qu'il est autre chose.

0voto

Óscar López Points 97105

Pourquoi ne pas déclarer le tableau en tant que type réel? comme ceci:

String[] myObj = new String[]{"one", "two", "three"};

De cette manière, le transtypage n'est pas nécessaire

0voto

Vincent Ramdhanie Points 46265

Il y a une différence entre le type apparent et le type réel. La déclaration Object myObj[] indique à Java que vous déclarez un tableau d'objets. À la compilation, c'est le seul type qui intéresse Java. Plus tard, lorsque vous essayez d'accéder aux éléments du tableau, Java suppose Object et rien d'autre. Le String est appelé le type réel et n'est "connu" qu'à l'exécution. d'où la nécessité du transtypage.

0voto

MK. Points 11889

Le type de l'objet que vous essayez d'itérer est vérifié au moment de la compilation. Et au moment de la compilation, la seule information disponible est le type déclaré de la variable. Le compilateur ne peut pas [de manière fiable, toujours] comprendre que vous avez réellement mis un String[] là-dedans (cherchez "problème de l'arrêt" sur Google pour savoir pourquoi).
Les informations sur le type d'exécution sont utilisées pour le polymorphisme, la conversion de type, éventuellement d'autres choses auxquelles je ne peux pas penser pour le moment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X