Bonsoir... ou bonjour ! (il est si tard qu'en fait il est très tôt )
Quelques questions s'agissant du type wildcard. Mais d'abord un premier bout de code :
Questions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import java.util.ArrayList; public class TestJava2 { private static void addObject(ArrayList<?> list) { list.add( new Object() ); // Erreur à la compilation (1) } private static void addInteger(ArrayList<?> list) { list.add( new Integer(1) ); // Erreur à la compilation (2) } public static void main(String[] args) { ArrayList<?> list = new ArrayList<Integer>(); list.add(new Integer(1)); // Erreur à la compilation (3) list.add(new Object()); // Erreur à la compilation (4) } }
1) Sauf erreur, dans un code utilisant les generics, le point d'interrogation '?' représente un type inconnu. De fait, je comprends que le compilateur grogne s'agissant de addObject() et addInteger() : ces méthodes ignorent le type des données stockées dans les ArrayList; elles ignorent s'il s'agit d'Objects, d'Integers, ou autre; en conséquence il est normal de refuser l'appel à la méthode add(). Confirmez-vous qu'il s'agit bien là de la raison qui amène le compilateur à rejeter ces lignes (1) et (2) ?
2) Sauf erreur, suite à une opération de "type erasure", list est en fait un objet de type ArrayList (on a perdu l'information "<Integer>") : est-ce exact ?
3) Il n'empêche que je reste dubitatif quant à la cause des erreurs 3 et 4... Si list est considérée comme un ArrayList, sans aucune précision quant au type des données stockés, alors la situation est similaire à celles des erreurs (1) et (2)... Toutefois, les erreurs (3) et (4) concernent des lignes de code dans le main() où est créée la variable list... en conséquence le compilateur est en mesure de savoir que list est une ArrayList<Integer>... Aussi pourquoi l'erreur (3) : il s'agit d'une situation où il n'y a pas d'incertitude sur la nature de list ?
Autre bout de code, et deux autres questions !
Questions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; public class TestJava2 { public static void main(String[] args) throws IOException { final Path pathSource = Paths.get("d:/mon_fichier_source.txt"); final Path pathCible = Paths.get("d:/mon_fichier_cible.txt"); final List<String> lignes = Files.readAllLines(pathSource, StandardCharsets.UTF_8); Files.write(pathCible, lignes, StandardCharsets.UTF_8); } }
4) Pourquoi ça compile ? On utilise la fonction :
String implémente les interfaces Serializable, CharSequence et Comparable<String>. Donc si on passe un objet de type String à write(), il est logique que le compilateur ne trouve rien à redire... Mais dans le cas présent, on passe une List<String>, et je ne vois pas comment cette liste se conforme à l'interface CharSequence ou dérivée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part public static Path write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options) throws IOException
5) A l'exécution, ça ne fonctionne pas tout à fait ! Avec le fichier ci-dessous (qui est bien en UTF-8 w/o BOM, Notepad++ est affirmatif), j'obtiens un fichier "mon_fichier_cible.txt" identique à la source n'était une ligne vide supplémentaire en fin de fichier ?
D'avance merci pour tout éclaircissement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 bla blabla ÂïÔù EOF
Partager