import java.util.ArrayList; class CastDemonstration { public static void main(String[] args) { // types primitifs : le cast peut servir // à convertir les types double toto = 3.3D; int titi = (int)toto; System.out.println(toto); System.out.println(titi); // génériques ArrayList ls = new ArrayList<>(); ls.add("salut"); ls.add("c'est moi"); // une liste de string est une liste de qqch ArrayList l = ls; // si je sais que ma liste de qqch est en fait // une liste de String, je peux le dire au compilo // avec un cast. ArrayList sl = (ArrayList)l; // warning: [unchecked] unchecked cast System.out.println(sl.get(0) + sl.get(1)); // je peux aussi mentir au compilo, mais je serai puni par // des erreurs à l'exécution. ArrayList il = (ArrayList)l; // warning: [unchecked] unchecked cast System.out.println(il.get(0) + il.get(1)); // java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer // Une liste de String n'est pas une liste d'Object : // on ne peut pas utiliser add(Object) sur une // liste de String. ArrayList ol = new ArrayList(); // error: incompatible types // Ça ne marche pas non plus avec un cast, car // la référence vers la liste originale existe // toujours : grâce au cast, on pourrait ajouter // un Object dans la liste de String. ArrayList ol2 = (ArrayList)new ArrayList(); // error: inconvertible types // Une liste d'Object ne peut pas être convertie // en liste de String, même si on sait qu'elle ne // contient que des String, pour la même raison // qu'avant (on pourrait ajouter un Object dans // la liste de String par la référence qu'on a // toujours sur la liste d'Object) ArrayList ol3 = new ArrayList(); ol3.add("test"); ArrayList os = (ArrayList)ol3; // error: inconvertible types } }