Java泛型知识点总结

所谓泛型, 就是允许在定义类、 接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。 这个类型参数将在使用时(例如,继承或实现这个接口, 用这个类型声明变量、 创建对象时) 确定(即传入实际的类型参数, 也称为类型实参)【本质是参数化类型】

使用泛型而不是object的原因:

  • 解决元素存储的安全性问题
  • 解决获取数据元素时, 需要类型强制转换的问题

Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。【在编译时而不是运行时检测错误】

泛型中的T只能是类,不能用基本数据类型填充,但可以使用包装类填充

泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。比如:<E1,E2,E3>

泛型类的构造器中不要有《E》

实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致【JDK7后可省略】

泛型不同的引用不能相互赋值【是平行关系, 在编译时ArrayList《String》和ArrayList《Integer》是两种类型,但在运行时只有一个ArrayList被加载到JVM中(类型擦除)】

泛型如果不指定,将被擦除,泛型对应的类型均按照Object处理,但不等价于Object。 【泛型要使用一路都用。要不用,一路都不要用】

如果泛型结构是一个接口或抽象类,则不可创建泛型类的对象

在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法中不能使用类的泛型

异常类不能是泛型的, 不能在try-catch中使用泛型定义

不能使用new E[]。但是可以: E[] elements = (E[])new Object[capacity](因为E只是一个参数,不是类)

父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型:

  • 子类不保留父类的泛型:按需实现

没有类型 擦除
具体类型

  • 子类保留父类的泛型:泛型子类

全部保留
部分保留

方法,也可以被泛型化,不管此时定义在其中的类是不是泛型类。 在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型
[访问权限] <泛型> 返回类型 方法名([泛型标识 参数名称]) 抛出的异常【作用是为了提示编译器T不是一个类】

如果Y是X的一个子类型(子类或者子接口),而G是具有泛型声明的类或接口, G并不是G的子类型【不具备协变】

通配符: List<?>是List、 List等各种泛型List的父类;读取List<?>的对象list中的元素时,永远是安全的,因为不管list的真实类型是什么,它包含的都是Object; 写入list中的元素时,不行。因为我们不知道c的元素类型,我们不能向其中添加对象【将任意元素加入到其中不是类型安全的】。唯一的例外是null,它是所有类型的成员。

通配符 不能用在泛型方法声明上,返回值类型前面<>不能使用?, 不能用在泛型类的声明上, 不能用在创建对象上,右边属于创建集合对象

有限制的通配符:

  • 上限extends:使用时指定的类型必须是继承某个类,或者实现某个接口,即<=【只读不可写,producer】
  • 下限super:使用时指定的类型不能小于操作的类,即>= 【只写不可读,comsumer】

PECS原则: Producer Extends Consumer Super
如果参数化类型表示一个生产者,就使用<? extends T>;如果它表示一个消费者,就使用<? super T>
在List<? extends Fruit>的泛型集合中,对于元素的类型,编译器只能知道元素是继承自Fruit,具体是Fruit的哪个子类,这是无法知道的,所以向一个无法知道具体类型的泛型集合中插入元素是不能通过编译的.但是,由于知道元素是继承自Fruit,所以从这个泛型集合中取Fruit类型的元素是可以的.
在List<? super Apple>的泛型集合中,元素的类型是Apple的父类,但无法知道是哪个具体的父类,因此读取元素时无法确定以哪个父类进行读取.插入元素时,可以插入Apple与Apple的子类,因为这个集合中的元素都是Apple的父类.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值