ジェネリック医薬品と型消去

public class K_GenricTypes {
    public static void method(List list) {
        System.out.println("method");
    }
}

上記のカテゴリをコンパイル:.あるJavacがUTF-8 \ K_GenricTypes.javaを-encoding

javap -verbose \ K_GenricTypes.class:クラスの逆コンパイルを生成した後。

 

ジェネリック型の方法とWriteメソッドは、そのような、逆コンパイルクラスをコンパイル

public class K_GenricTypes {
    public static void method(List<String> list) {
        System.out.println("method");
    }
}

これらの二つのクラスにコンパイルされたコードのトランスにおける方法の比較方法

ジェネリックメソッドメソッド非ジェネリックメソッドの方法で(一覧<文字列>リスト)(一覧リスト)コントラスト:

1、コード全く同じ特性

2、非ジェネリックメソッドよりジェネリックメソッドシグネチャ特性。

 

使用される一般的なJava言語が疑似消去一般的な実装方法ですので、一般的な情報(型変数、パラメータ化された型)に続いてバイトコード(Code属性)は、全ての消去にコンパイルされています。Java言語の操作は、リスト<文字列>であるためそのため、一覧<整数>同じクラスです。

消去不足を補うためには、署名のプロパティを追加しました。署名の役割属性が署名方法であって、前記バイトコードレベルに格納され、このプロパティは、パラメータの型がパラメータ型を含むが、ネイティブ型、ない保持します。

 

実行時には、一般的な情報は、例えば、反射によって取得することができます。

public class K_GenricTypes {
    public static void method(List<String> list) {
        System.out.println("method");
    }
}

class K_GenricTypesMain {

    public static void main(String[] args) throws Exception{
        Method method = K_GenricTypes.class.getMethod("method",List.class);
        Type[] types = method.getGenericParameterTypes();
        for (Type type : types) {
            System.out.println("参数类型:"+type);
            //参数类型:java.util.List<java.lang.String>
            if(type instanceof ParameterizedType){
                Type[] paramType = ((ParameterizedType) type).getActualTypeArguments();
                for (Type t : paramType) {
                    System.out.println("泛型类型:"+t);
                    //泛型类型:class java.lang.String
                }
            }
        }

    }
}

 

 

公開された51元の記事 ウォン称賛14 ビュー40000 +

おすすめ

転載: blog.csdn.net/u010606397/article/details/82928438