先看如下代码,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