Maison > Java > javaDidacticiel > le corps du texte

Quel est le principe de l'effacement générique Java

王林
Libérer: 2023-05-09 12:40:17
avant
1407 Les gens l'ont consulté

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        
}
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal