[关闭]
@spiritnotes 2016-03-22T09:56:44.000000Z 字数 684 阅读 1282

理解Java泛型

Java


Why

之前Java是没有泛型的,所有的容器均是object为元素的,这样就可以针对任何类型都可以使用,这样会产生问题

引入

引入类型参数,然后会做类型检查

  1. ArrayList<String> s = new ArryList<String>;
  2. s.add("abc");
  3. String a = s.get(0);

泛型类

具有一个或多个类型参数的类

泛型方法

带有类型参数的方法

类型变量的限定

深入理解实现

虚拟机中不存在泛型概念。

类型擦除
虚拟机里面实现的类对应的类型为原始类型(raw type),将类型参数替换为 BoundingType(未限定则替换为Object)
编译器替换
编译器将我们对泛型类方法的调用转化为两条虚拟机指令,第一条获取对应的Object对象,第二条将其强制转化为当初我们指定的类型参数类型

javap -c -s Pair 查看

泛型方法也存在类型擦除

问题?
针对方法擦除后,则可能产生如下问题,之前的函数实现为 x(Date),而擦除后变为 x(Object),而对于新对象其可能没有 x(Object)方法,或者有而非相同方法,怎么解决?

编译器生成一个桥接方法,将对Object的方法调用转到Date类型上

  1. public void setSecond(Object second){
  2. setSecond((Date)second)
  3. }

注意事项

类型通配符

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注