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