读编写高质量代码整理(八)

java的泛型是类型擦除的。

java泛型加强了参数类型的安全性,减少了类型转换,它与C++模板(template)非常类似,有不同,java的泛型在编译器有效,在运行期被删除。

import java.util.List;
public class Foo {
	//overload
	public void arrayMethod(String[] strArray) {
		
	}
	public void arrayMethod(Integer[] intArray) {
		
	}	
	//overload
	public void listMethod(List<String> stringList) {

	}
	
	public void listMethod(List<Integer> intList) {

	}
	
}

 编译后:

 我们知道方法的重载类型应不同,我们得出的结论是List<Integer>和List<String>的类型是相同的。

我们做个测试

List<String> ls = new ArrayList<String>();
List<Integer> li = new ArrayList<Integer>();
System.out.println(ls.getClass() == li.getClass());

 结果为:true

这边是java泛型引起的问题,在编译后所有的泛型做相应的转化。准换规则如下:

List<String>、List<Integer>、List<T>擦除后的类型是List

推而广之,List<String>[]、List<Integer>[]擦除后的类型为List[]

List<? extends E>,List<? super E>擦除后的类型为List<E>

所以泛型数组初始化时不能声明泛型类型,因为他们的擦除后类型相同。

List list  = new ArrayList<String>();

list instanceof list<String>此类的表达都不能通过编译,因为泛型类型被擦除了。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值