Document

Transcription

Document
634.1 – Programmation Généricité – Code généré Rappel du fonctionnement Lors de la compilation, les types paramétrés sont utilisés pour détecter des erreurs (par exemple : insertion d’un Integer dans un Vector<String>) et pour simplifier l’écriture du code en évitant des type‐guards. Une fois compilée, la classe générique n’a qu’une seule définition sous‐forme de bytecode (un seul fichier .class). Le code compilé ne comporte aucune indication sur les types paramétrés ; il est en fait similaire à celui qu’on peut produire en java 1.4 sans généricité. A l’exécution, la notion de type paramétré n’existe donc pas. Code généré L’exemple ci‐dessous illustre ce fait. Le code décompilé a été obtenu en employant le logiciel CavaJ (http://cavaj‐java‐decompiler.softonic.fr) qui reconstruit le code source à partir du bytecode. Code source Code décompilé public class ClasseParam <T> { private T x; public void set (T x) {this.x = x;} public T get () {return x;} } // ClasseParam public class ClasseParam { private Object x; public ClasseParam () {} public void set (Object obj) {x = obj;} public Object get () {return x;} } public class Main { public static void main (String[] args) { ClasseParam<String> cString = new ClasseParam<String>(); cString.set("Hello"); String s = cString.get(); ClasseParam<Integer> cInt = new ClasseParam<Integer>(); cInt.set(new Integer(1234)); Integer i = cInt.get(); } // main } // Main public class Main { public Main () {} public static void main (String args[]) { ClasseParam classeparam = new ClasseParam(); classeparam.set("Hello"); String s = (String)classeparam.get(); ClasseParam classeparam1 = new ClasseParam(); classeparam1.set(new Integer(1234)); Integer integer = (Integer)classeparam1.get(); } } 634.1 – Programmation / P. Daehne 1 / 1 Version 1.0 – 16.04.2012

Documents pareils