1. Description
Pendant le processus de compilation, les informations sur les variables de type peuvent être obtenues. Par conséquent, la méthode set peut être vérifiée dans le compilateur et les types illégaux ne peuvent pas être compilés. Mais pour la méthode get, en raison du mécanisme d'effacement, le type de référence réel pendant le fonctionnement est le type Object.
Afin de restaurer le type du résultat renvoyé, le compilateur ajoute une conversion de type après get. Par conséquent, il existe une logique de conversion de type à la ligne 18 du corps de la méthode principale du fichier genericHolder.class. Ceci est ajouté automatiquement par le compilateur.
Nous avons donc traité des emplacements de lecture et d'écriture des objets génériques et ajouté des restrictions au code.
2. Exemple
//GenericHolder.java public class GenericHolder<T> { T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } public static void main(String[] args) { GenericHolder<String> holder = new GenericHolder<>(); holder.setObj("Item"); String s = holder.getObj(); } } //GenericHolder.class public class GenericHolder<T> { T obj; public GenericHolder(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public T getObj(); Code: 0: aload_0 1: getfield #2 // Field obj:Ljava/lang/Object; 4: areturn public void setObj(T); Code: 0: aload_0 1: aload_1 2: putfield #2 // Field obj:Ljava/lang/Object; 5: return public static void main(java.lang.String[]); Code: 0: new #3 // class GenericHolder 3: dup 4: invokespecial #4 // Method "<init>":()V 7: astore_1 8: aload_1 9: ldc #5 // String Item 11: invokevirtual #6 // Method setObj:(Ljava/lang/Object;)V 14: aload_1 15: invokevirtual #7 // Method getObj:()Ljava/lang/Object; 18: checkcast #8 // class java/lang/String 21: astore_2 22: return }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!