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

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

王林
王林avant
2023-05-09 12:40:171457parcourir

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer