类型擦除

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值