Java泛型 ( Generic) 概述

目的

背景:
jdk1.5 之前,对象保存到集合中会丧失类型,变为Object,
被取出时需要类型转换,可能转错

  • 在定义集合时就限定了传入集合的元素对象类型
    使得同一集合中只能有同一类型的元素
  • 生成的class文件中将不再保留泛型信息

书写规则

创建对象时,若两边都有泛型,声明和新建对象内的泛型类型要一致\n List list= new List
泛型的类型
<>中必须是引用类型,不能是基本数据类型
特点

特点

优点

  • 类型安全
  • 无需手动转型
  • 消除运行时异常ClassCastException ,
  • 若有类型错误,在编译时报错

缺点

书写变复杂

在自定义类型中使用泛型

什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,

class Utils<QQ>{//class 后的<>泛型限定, 
	private QQ q;
	public void setObject(QQ q){ //参数类型
	this.q = q;
}
	public QQ getObject(){ //返回值
		return q;
	}
}
Utils<Worker> u = new Utils<Worker>();
u.setObject(new Student());
Worker w = u.getObject();;
//泛型前做法。
class Tool{
	private Object obj;
	public void setObject(Object obj){
	this.obj = obj;
}
	public Object getObject(){
		return obj;
	}
}
Tool t = new Tool();
t.setObject(new Student());
Worker w = (Worker)t.getObject()//类型转换;

泛型方法

一般方法

  • 在泛型类定义泛型,在整个类中都有效。
  • 为了让同一类中的不同方法可以操作不同类型, 而且类型还不确定。可以将泛型定义在方法上。
  • 当泛型类已经被定义时,通过在<>内使用不同的符号来表示不同的引用类型
class Demo<T>{
	public void show(T t){
		System.out.println("show:"+t);
	}
	public <Q> void print(Q q){ //注意:这里的<Q>不是返回值,是定义的泛型类型
		System.out.println("print:"+q);
	}
	public static <W> void method(W t){//<w>定义泛型类型W
		System.out.println("method:"+t);
	}
}

当泛型类未定义时,不管方法内部的符号是否相同,
不同方法之间的泛型类型不相互影响

class Demo{
	public void show(T t){
		System.out.println("show:"+t);
	}
	public void print(T t){
		System.out.println("show:"+t);
	}
}

静态方法

静态方法不能使用类上定义的泛型,如果静态方法需要使用泛型\n需要在函数定义的返回值类型左侧定义\

public static <W> void method(W t)
{
	System.out.println("method:"+t);
}

因为静态 在定义类时就需要加载,
而泛型类的泛型具体类型在运行时才能确定

泛型限定*

<? extends Person> 指定泛型类型为Person和Person的子类 <? super E> 指定泛型类型为E和E的父类 举例:TreeSet (Comparator <? super E> comparator) \n构造一个新的空 TreeSet,它根据指定比较器进行排序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值