详解Java中的泛型
作者:tq02 发布时间:2021-12-02 14:57:34
一.什么是泛型
当我们不确定数据类型时,我们可以暂时使用一个字母 T代替数据类型。例如写一个方法,但是我们不知道它是传递的是什么数据类型,我们就可以使用泛型,到时候只要指明T是什么数据类型,就可以使用了。可以设想一下typedef,而类和方法都有涉及到类。
二.泛型类的使用
2.1泛型类的定义
泛型类的语法格式:
第一种:class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
第二种: class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}注:泛型只能接受类,所有的基本数据类型必须使用包装类!
代码实例:
如图,输出为10,我们定义了一个Text1的泛型类,当我们实例化泛型类时,定义了T为Integer包装类,那么所有T都为Integer,如果换为String类,那么所有的T都为String类,因此T可以代表任何数据类型,方便我们指定类型传参。
注:类名后的 <T> 代表占位符,表示当前类是一个泛型类
2.2泛型类的数组使用
泛型使用数组时: T[] ts = new T[5];//是不对的
原因:在编译时时,会把T转换为Object,而Object范围很大,到时候就无法确定是什么数据类型了。
代码示例:
public class Text1<T> {
public T[] array=(T[])new Object[10]; //1
public T getPos(int pos)
{
return this.array[pos];
}
public void setVal(int pos,T val)
{
this.array[pos]=val;
}
public static void main(String[] args) {
Text1<Integer> kk=new Text1<>();
kk.setVal(0,3);
kk.setVal(1,4);
int C= kk.getPos(1); //2
System.out.println(C);
}
}
代码中,注释1,由于无法直接new T[10],但是我们知道Object是所有类的父类,因此我们可以使用Object 然后再利用(T[ ])强制类型转换。
注释2,由于C的类型是int类型,所以不需要强制类型转换。
三.泛型的上界
上界,代表着是有上限的。特殊情况下:<T> 中的T也可能会是类,而想到类,我们可以试想,如果此类继承其它类的情况下会是什么样呢?
语法格式:
class 泛型类名称<类型形参 extends 类型边界> {
...
}
示例:
public class MyArray<E extends Number> {
... //相当于 < T >
}解析:可以把<E extends Number>当成<T>来看,Number可能是接口,也可能是类。而此时的T,有了限制,T的范围是 Number的子类。
注:泛型无下界。
四.泛型的方法
我们需要注意的是静态方法使用泛型。
语法格式:方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }
示例:
//静态的泛型方法 需要在static后用 <> 声明泛型类型参数
public static <E> void swap(E[] array, int i, int j) {
E t = array[i];
array[i] = array[j];
array[j] = t;
}注:其他的方法不需要用 <> 声明
五.泛型与集合
在之后的使用中,我们经常会在集合中使用泛型,例如创建一个集合,但是你确定好了类型时,我们就可以使用泛型,来防止我们之后不会出现添加意外。
代码示例:
如图,我们创建一个ArrayList集合,one对象的类型实参为Integer,所以只能存放整形数 two对象的类型实参为String,所以我们只能存放字符串 结论:一旦我们确定了类型,那么我们就只能存放该类型数据。
来源:https://blog.csdn.net/m0_74097410/article/details/130055159
猜你喜欢
- Mybatis selectKey返回新增用户的id值一、需求:新增用户后,同时还要返回当前新增用户的id值id是由数据库的自动增长来实现的
- 前言在实际项目开发中,会碰到这样的问题,数据库表结构设计好了,可实体类还没相应地弄出来。实体类的属性命名方法一般是驼峰法,而数据库中的表字段
- 前言在我们用户登录的时候,为了安全性考虑,会增加验证码的功能,这里采用的是google的kaptcha;spirngboot是轻便,独立,使
- 主要完成任务:1.read read 并行化2.read write 不允许3.write write 不允许public class Re
- 更新了AS 3.1.2之后,发现新建Kotlin类,类注释依然木有,没办法只有自己动手了。方法很简单,编辑File Header就可以啦。只
- Java 实现汉字转换为拼音转换类public class PINYINChinese { private static int
- 本文实例为大家分享了利用Swing绘制一个动态时钟的具体代码,供大家参考,具体内容如下效果代码在下面,可跳过解析。前言编程实现一个时钟利用S
- 我的电脑环境win10vscode 1.36.1vscode安装插件安装完这个插件后会提示你安装 platformIOCore,按照提示安装
- jmap:Java内存映像工具jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文
- 前言我们在实际项目中,除了会碰到一对一的情况,还有一对多的情况,比如一个用户可以有多辆车,而一辆车只能有一个用户等等,今天我们就来一起学习下
- 要实现摇一摇的功能,类似于微信的摇一摇方法1:通过分析加速计数据来判断是否进行了摇一摇操作(比较复杂)方法2:iOS自带的Shake监控AP
- 本文实例为大家分享了java实现鲜花销售系统的具体代码,供大家参考,具体内容如下一、练习目标1.体会数组的作用2.找到分层开发的感觉3.收获
- 线程可以划分优先级,优先级高的线程得到的CPU资源比较多,也就是CPU优先执行优先级高的线程对象中的任务。设置线程优先级有助于帮助线程规划器
- 这篇文章主要介绍了spring boot 2整合swagger-ui过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- MapReduce的原理MapReduce由两个主要阶段组成:Map和Reduce。在Map阶段中,数据集被分成若干个小块,每个小块由Map
- 1. Limit实现分页1.1 为什么需要分页 减少数据的处理量1.2 使用Limit实现分页select * from user limi
- 简介JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation。在任何时候,当你要处理一个应用程序的业务逻
- 在开发过程中,我们经常需要将数据库查询到的值放入jsp页面进行显示,在springmvc的controller中,我们采用request将数
- 下载:1.在spring-mvc中配置(用于100M以下的文件下载)<bean class="org.springframe
- 本文实例讲述了C#获取真实IP地址实现方法,分享给大家供大家参考。具体实现方法如下:通常来说,大家获取用户IP地址常用的方法是:string