【泛型详细】

前言

|ू・ω・` )
在之前的文章中我也稍微提了一点,但用处不大,所以在今天打算整理并彻底写好。
在个人的眼里,我感觉要看明白源代码,就要先明白泛型是什么?

泛型的概念

泛型的地位: 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。
泛型的本质是为了参数化类型(也就是说在你定义了泛型参数后,就不需要去多创建个新类)

也就是说在泛型使用过程中,

操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类泛型接口泛型方法

最简单的泛型

List arrayList = new ArrayList<>();//实列化个arraylist集合   可没用到泛型的
		arrayList.add("aaaa");
		arrayList.add(100);//两种类型都可以加进去,并不报错

所以在加入到list的时候,不会报错,可如果你要对这个集合进行某个操作时,就会报错
而且还不知道在哪;
可如果在实列化的时候加上泛型:

List<String> arrayList = new ArrayList<>();;//实列化个arraylist集合   用到泛型的

就会在编译的时候,报错,并提醒;
为了解决类似这样的问题(在编译阶段就可以解决),泛型应运而生

泛型的特征

在这里插入图片描述
通过上面的例子,可以知道:
也就是说Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。
也就是说,泛型信息不会进入到运行时阶段。
在这里插入图片描述
对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。

泛型的使用类型:泛型类、泛型接口、泛型方法

泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法

泛型类

在泛型应用中我们在创建类的同时,如果给他加了个 < T > 之类的泛型标识的话,这个就叫泛型类
最典型的就是各种容器类,如:List、Set、Map。
比如自己写的:
在这里插入图片描述
OK,来看看实列,
在这里插入图片描述
打印:
在这里插入图片描述
当然,如果你不写T,也就是不往<>里面写类型的话:

tool toolInt = new tool(12, 12);
tool toolInt = new tool("aaaa", 12);
tool toolInt = new tool(12.12, 12);
tool toolInt = new tool(false, 12);

可以为任何类型 输出;
!!注意:

  • 泛型的类型参数只能是类类型,不能是简单类型。
  • 不能对确切的泛型类型使用instanceof操作。如下面的操作是非法的,编译时会出错。
	if(tool2 instanceof tool< Number >){
	
	 }

泛型接口

泛型方法泛型接口的概念差不多,泛型接口常被用在各种类的生产器中
看例子:

在这里插入图片描述
实现一个tool2的时候是怎么样的:
在这里插入图片描述

泛型通配符

在使用一个用了泛型的类来做一个形参的话,那我们是直接给它定好tool< integer>,还是怎样?
在这里插入图片描述
所以我们就需要用到了通配符。
在这里插入图片描述

类型通配符一般是使用?代替具体的类型实参,注意了,此处’?’是类型实参,而不是类型形参

再直白点的意思就是,此处的?和Number、String、Integer一样都是一种实际的类型,是所有类型的父类。是一种真实的类型。

可以解决当具体类型不确定的时候,这个通配符就是 ?

泛型方法

基本泛型方法

泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。

//首先在public与返回值之间的<T>必不可少,这表明这是一个泛型方法,并且声明了一个泛型T
//泛型的数量也可以为任意多个 
//如 :public <T,K> K showTValues(Generic<T> container){}

public <T> T  MethodT(tool<T>  tl ){//给他定义一个T类型的返回类型 ,参数为tool类型就行
		
		return tl.getT();//返回的类型还是T类型
	}

基本泛型方法:只有声明了< T >的方法才是泛型方法。

类中的泛型方法

嗯,有一种情况是非常特殊的,当泛型方法出现在泛型类中时:
先写一个泛型类:
在这里插入图片描述
然后让我们去看看他们的实现:
在这里插入图片描述
所以在泛型类中写泛型方法,要着重注意这两个问题;

可变参数

这个挺简单的,所以看例题:

public <T> void printMsg( T... args){
    for(T t : args){
       System.out.println(t);
    }
}
//实现
printMsg("111",222,"aaaa","2323.4",55.55);

静态方法

静态方法有一种情况需要注意一下,那就是在类中的静态方法使用泛型
如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 。

 public static <T> void show(T t){

    }

泛型上下边界

在使用泛型的时候,我们还可以为传入的泛型类型实参进行上下边界的限制,
如:类型实参只准传入某种类型的父类或某种类型的子类。
代码:

tool<? extends Number> 

在这里插入图片描述
其实这个上界就是 能继承于哪个?
在这里插入图片描述
至于下限:就是你一开始就定义的那个 < T >

总结:

泛型的使用:方法有很多种,在开始的时候可能会有点绕,但是慢慢的去理解,其实也是可以理解透彻的。

我觉得学会了泛型才能开始去看源码,如果这个没能理解的话,源码是看不懂的。

本章中重点在于泛型的使用类型;

Thanks♪(・ω・)ノ谢谢大家能够用来参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值