类型擦除

先看如下代码,paramType方法重载,方法参数会因为泛型类型擦除而方法签名相同,从而在Eclipse编译器里面报错(Method paramType(ArrayList<Integer>) has the same erasure paramType(ArrayList<E>) as another method in type ParameterizedTypeOverload),但是在javac编译器中,因为class文件结构,允许方法签名一样,返回值不同的方法工作,并且能执行

import java.util.ArrayList;

public class ParameterizedTypeOverload {
	public static String paramType(ArrayList<String> list) {
		System.out.println("ArrayList<String> list");
		return "";
	}

	public static int paramType(ArrayList<Integer> list) {
		System.out.println("ArrayList<Integer> list");
		return 1;
	}
	
	public static void main(String[] args){
		paramType(new ArrayList<String>());
		paramType(new ArrayList<Integer>());
	}
}

方法执行结果如下:

F:\eclipsestudyworkspace\study\src>java ParameterizedTypeOverload
ArrayList<String> list
ArrayList<Integer> list

类型擦除只会擦除方法中Code属性中的字节码,但是元数据里面的泛型信息还是保存在(javap -verbose得到如下字节码)。

Code属性:

public static java.lang.String paramType(java.util.ArrayList);
  Code:
   Stack=2, Locals=1, Args_size=1
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #3; //String ArrayList<String> list
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   ldc     #5; //String
   10:  areturn
  LineNumberTable:
   line 5: 0
   line 6: 8

  Signature: length = 0x2
   00 14

 元信息:

const #8 = Method       #7.#27; //  java/util/ArrayList."<init>":()V
const #9 = Method       #11.#36;        //  ParameterizedTypeOverload.paramType:(Ljava/util/ArrayList;)Ljava/lang/String;
const #10 = Method      #11.#37;        //  ParameterizedTypeOverload.paramType:(Ljava/util/ArrayList;)I
const #11 = class       #38;    //  ParameterizedTypeOverload

猜你喜欢

转载自chenghao666.iteye.com/blog/2289858