ホームページ  >  記事  >  Java  >  Javaの汎用消去の原理は何ですか

Javaの汎用消去の原理は何ですか

王林
王林転載
2023-05-09 12:40:171389ブラウズ

1. 説明

コンパイル処理中に、型変数の情報を取得できます。したがって、set メソッドはコンパイラで型チェックでき、不正な型はコンパイルできません。ただし、get メソッドの場合、消去メカニズムにより、操作中の実際の参照型は Object 型になります。

返された結果の型を復元するために、コンパイラは get の後に型変換を追加します。したがって、genericHolder.class ファイルのメイン メソッド本体の 18 行目に型変換ロジックがあります。これはコンパイラによって自動的に追加されます。

そこで、汎用オブジェクトの読み取りおよび書き込みの場所に対処し、コードに制限を追加しました。

2.例

//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        
}

以上がJavaの汎用消去の原理は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。