java 泛型

泛型可以看做普通类的工厂

泛型的好处

  1. 解决强制类型转换
  2. 避免插入错误类型的对象

类型变量的限定

<T extends BoudingType >
表示T应该是绑定类型的子类型,T和BoudingType可以是类也可以是接口。
可以通过 & 来进行多个限定。例如 T extends Comparable & Serializable

泛型代码和虚拟机

泛型类型代码都会被翻译成普通类,泛型类型被擦除掉;也就是说虚拟机中没有泛型类型对象。

约束和局限性

  1. 不能用基本类型实例化类型参数
  2. 运行类型检查(instanceof)只适用于原始类型
  3. 不能创建参数化类型的数组
  4. 不能实例化类型变量
  5. 泛型类的静态上下文中类型变量无效
  6. 不能抛出和捕获反省类的实例

通配符类型

  1. 类型限定(协变)
    ?extends BoudingType
    可以作为返回值,不能作为参数传递
  2. 超类型限定(逆变)
    ? super BoudingType
    不可以作为返回值,可以作为参数传递
  3. 无限制通配符
    可以作为返回值,不能作为参数传递

协变和逆变

Number num = new Integer(1);  
ArrayList<Number> list = new ArrayList<Integer>(); //type mismatch
List<? extends Number> list = new ArrayList<Number>();
list.add(new Integer(1)); //error
list.add(new Float(1.2f));  //error

? extends Number 表示 绑定类型是Integer或者Float等,具体类型不清楚,所以调用add会报错。

定义:

  • 当A ≦ B时,如果有f(A) ≦ f(B),那么f叫做协变;
  • 当A ≦ B时,如果有f(B) ≦ f(A),那么f叫做逆变;
  • 如果上面两种关系都不成立则叫做不可变。

使用总结:

  • 要从泛型类取数据时,用extends;
  • 要往泛型类写数据时,用super;
  • 既要取又要写,就不用通配符(即extends与super都不用)。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 定义 逆变与协变用来描述类型转换(type transformation)后的继承关系,其定义:如果A、B表示类型...
    开发者小王阅读 25,887评论 4 61
  • 我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值。 假如我们现在...
    今晚打肉山阅读 4,803评论 0 1
  • [TOC] 深入理解 Java 泛型 概述 泛型的本质是参数化类型,通常用于输入参数、存储类型不确定的场景。相比于...
    albon阅读 10,798评论 0 7
  • 今晚,我和D先生在一家有点小情调的餐厅吃西餐,我感慨着,我们好顺利啊,从恋爱到结婚整个过程都很自然,没有出现一个人...
    于兔兔君阅读 1,297评论 0 0

友情链接更多精彩内容