基础篇-泛型Generics

【问题】:编写阶段,定义类时,无法确定类或方法的属性类型

【解决】:

  1. 使属性类型定义为<泛型列表>,大大了提升了灵活度
  2. 减少了Object类的强制转换的性能消耗
  3. 将运行阶段的问题在编译阶段就进行解决
适用场景
类 / 集合类成员属性类型方法形参属性类型返回值属性类型
使用须知
  1. 泛型不支持基本类型
  2. 不确定类型时,泛型擦除默认Object类型,无需强制转换
  3. 不同类型创建的泛型类实例,运行阶段为同一份泛型类

原因:通过反射getClass()函数查看其运行时类型,为同一份泛型类

//泛型类
public class Mian<T,E>{

	private T type;
	
	public E method(E t){
	
	}
}

//泛型方法
public class Mian<T>{

	private T type;
	//泛型列表的方法
	public <E> E method(E e){
	
	}
}

  1. 调用泛型类或泛型方法的时候,定义泛型实际类型,灵活性高。
  2. 若调用时,没有手动进行定义泛型实际类型,JVM系统进行类型擦除,泛型标识不会进入运行期间,类型擦除默认Object,有限制默认为上限类型或下限类型。

泛型类接口与泛型方法

泛型类 泛型接口:作用域操控全局的泛型符号

  1. 子类继承父类,泛型标识保留
    理据:因为创建子类时,触发父类的加载,若不一致则造成父类泛型无法确定
  2. 子类继承父类,保留泛型标识,可扩展泛型标识
  3. 子类继承父类,但子类是普通类,需对父类泛型标识进行确定
  4. 重写方法时与父类方法泛型标识一致

泛型方法:可以重新定义泛型标识内容,可独立覆盖泛型类的泛型符号

  1. 泛型方法不能为直接静态,否则调用时无泛型标识类型确定
  2. 泛型方法返回值与形参必须都泛型标识

泛型常用符号

常规泛型标识(形参)
  • <T> Type类的属性类型
  • <E> Element元素属性类型
  • <K> Key键
  • <V> Value值
    举例:Class Construcor
可变泛型标识
  • <E…e> 可以传入多个类型
多态泛型标识(多态实参)

泛型通配符< ? >

  • <?> 上下无限制,与泛型功能一致,无意义
  • <? extends 上线类型> 上限制约束,只能等于或更小
    举例:List ArrayList
  • <? super 下限类型> 下限制约束,只能等于或大于
    举例:TreeSet

泛型抹除

泛型符号在存在编译阶段,进入加载阶段JVM对泛型类型抹除替换为你所调用时传入的类型,默认无限制则为Objcet,默认上下限则为上下限制类型。

注意:即使确定了泛型类型,但在运行阶段为同一种属性类型
理据:反射继续运行类型对比

桥接方法

实现接口的类将会生成桥接方法
理据:使用反射,打印所有方法

自定义泛型数组

1. 泛型数组引用,但不能直接创建泛型数组对象
arraryList<Type>[] array = new arrayList[];

2.使用反射java.lang.reflection.array定义一个泛型array工具类
成员变量
private T[] array;
构造方法
array = (T[])Array.newInstance(clz,length);
Putting方法
array[index]=item;
Getting方法
return array;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值