泛型

Jdk 5 中定义了泛型 。泛型即 参数化类型
Jdk7中定义了菱形语法

泛型类和泛型接口

任何类,接口都可以通过声明 类名或者接口名时 增加泛型声明,成为泛型类和泛型接口

由于泛型只是编译阶段进行检查,而不是更改源代码,所以不同类型参数的泛型类依然是同一个类,而且静态方法、静态初始化块以及静态变量不能使用参数化类型

Apple extends Fruit 错误的(同样Fruit类的构造器也不能是Fruit,必须是Fruit)
Apple extends Fruit 正确
Apple extends Fruit 则默认 参数化类型为Object

类型通配符 主要是用于实例变量 方法形参
A类 是B类的子类 但 C 不是C的子类
虽然 C
和 C 是同一个 Class ,但是 如果参数要求C 就不能输入 C
这样设计的原因是为了 最大程度避免 ClassCastException

注意: 由于数组java设计的比较早, A[] 是B[]的子类
参数要求B[] 但是可以输入 A[]

由于C 不是C的子类 ,所以为了解决如何表示 有可能为任何泛型C类,就需要通配符 “?”
C<?>则是任何泛型C类的父类

但是“?”代表的参数化类型 共同点 仅仅 都是 Object的子类 ,只能使用 Object方法
如果想表示 某泛型 c类 子类的集合 就需要 类型通配符上限

C<? extends thisClass>
注意List<? extends B> 对象 不能添加 A类对象 因为 虚拟机不确定list中的元素确定是哪个类

但是 List对象 是可以添加 A类对象的。

注意不仅可以给类型通配符 上限也可以给在声明类型化参数时 给予上限
这样类型化参数就被限定于某一些类 (包括 泛型类和 泛型方法 构造器 都可以 给类型化参数上限)

泛型方法 和泛型类互不干扰 ,是两个东西

泛型类也可以有泛型方法
泛型类的类型化参数特指类名处声明的类型化参数

泛型方法的类型化参数 范围在方法体内 ,而泛型类的类型化参数的范围在类内
泛型方法类型化参数不需要显示声明,而是通过类型推断
而泛型类的类型化参数需要显示声明
泛型方法可以为静态方法, 而泛型类的类型化参数则无法被用于静态方法

泛型方法
修饰符 <T,S> 方法名 (方法形参)

泛型方法调用
调用者. <类型实参>方法名 (方法实参)
调用者.方法名 (方法实参) --根据类型 推断自动获得类型实参

大部分类型通配符都可以被泛型方法代替

泛型方法主要用于
1 描述两个形参间的依赖关系
2描述 形参和返回值类型间的关系
3向集合添加元素
List<? extends B> 对象 不能添加 A类对象 因为 虚拟机不确定list中的元素确定是哪个类
List就可以

泛型方法的下限

泛型方法的上限有的时候可以用泛型方法的下限表示
到底采用哪种,根据下面方法判断:

泛型通配符<? extends T >来接收返回的数据,此写法的泛型集合不能使用 add 方
法,而 <? super T> 不能使用 get 方法,做为接口调用赋值时易出错。
说明:扩展说一下 PECS(Producer Extends Consumer Super) 原则:第一、频繁往外读取内
容的,适合用<? extends T >。第二、经常往里插入的,适合用 <? super T> 。

泛型构造器 和泛型方法类似 ,但是要注意的是如果显示指定了泛型构造器中的声明的类型形参,就不能使用菱形语法

MyClass myClass=new MyClass<> (); 错误
MyClass myClass=new MyClass< String > (); 正确
MyClass myClass=new MyClass <> (5); 正确

泛型方法的类型推断
https://www.cnblogs.com/heimianshusheng/p/5766573.html

泛型方法的重载需要注意,不能仅仅看方法名相同 方法形参不同就可以了
因为 泛型方法的上限 下限可以转换,泛型方法的类型形参 和类型统配符可以互相转换

将一个带有泛型信息的变量赋值给一个没有泛型信息的变量时,泛型信息将被丢弃 这个过程 称作 擦除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值