java 泛型

1:什么是泛型?

Java泛型(generics)JDK5中引入的一个新特性,泛型提供了

编译时类型安全检测机制,

该机制允许程序员在编译时检测到非法的类型

泛型的本质是参数类型,也就是说所操作的数据类型被指定为一个参数

泛型不存在于JVM虚拟机

2:为什么要使用泛型?

泛型可以增强编译时错误检测,减少因类型问题引发的运行时异常

型具有更强的类型检查

泛型可以避免类型转换

泛型可以泛型算法,增加代码复用性

3:java 类中三种泛型

泛型是三大类:1:类泛型class  Person<T> 2:接口泛型 Inteface Person<T>   3:方法泛型  public  static <T>  void  getPerson()

4:通配符

泛型中的问号符“?”名为“通配符”

     通配符的类型:1:上限通配符 <? extends XXX>     它是老子,可以传参它的儿子

                               2:下限统配符 <? super XXX>     它是孙子,可以传参它的父亲类

                              3:非限制通配符 <?>

5:java 泛型遵循:PECS 原则

 如果你只需要从集合中获得类型T , 使用<? extends T>通配符

如果你只需要将类型T放到集合中, 使用<? super T>通配符

如果你既要获取又要放置元素,则不使用任何通配符

PECS即 Producer extends Consumer super,好处:提升了API的灵活性

6:泛型里面的擦除

   6.1 什么是擦除?产生的原因是啥?

         泛型的引入是为了api的扩展,但是由于是jdk1.5之后的事情,所以这个类型编译擦除也是一个伪擦除。主要是jvm字节码没有对应增加。

   6.2 :泛型擦除的原则:

         编译器会把泛型类型中所有的类型参数替换为它们的上(下)限,如果没有对类型参数做出限制,那么就替换为Object类型。 编译出的字节码仅仅包含了常规类,接口和方法。都保留在类的常量池里面。class.forname("")

 消除方法:同对泛型类的处理

无限制:替换为Object

有限制:替换为第一受限类型

6.3:泛型擦除后的一些后遗症:

     6.3.1:不可具体化类型:无法整个运行时可知其类型信息的类型,其类型信息已在编译时被擦除: 例如:List<String>和List<Number>,JVM无法在运行时分辨这两者。

    6.3.2:无法利用原始类型来创建泛型 ,解决方法:使用它们的包装类。

    6.3.3:无法创建类型参数的实例            变通方案:利用反射就是可以

   6.3.4:无法创建参数化类型的静态变量,但是可以创建静态方法    原因:静态变量是类所有,共享决定了其必须能确定。但多个类型作为参数传入此类的多个实例时,就会无法确定究竟赋予此静态变量哪个实例对象所传入的参数了,无法对参数化类型使用转换或者instanceof关键字。

   6.3.5:无法创建参数化类型的数组,协变和擦除断开了关系。

<T> 泛型

说出一下类型的区别 
Plate
Plate<Object>
Plate<?>
Plate<T>
Plate<? extends T>
Plate<? super T>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值