详解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


猜你喜欢
- 简介在多线程中解决线程安全的问题时常用到Synchronized,现在的synchronized相对于早期的synchronized做出了优
- 目录实现效果实现方式实现步骤Blend绘制Path绘制Path绘制直线绘制曲线改变曲线形状移除Path上的线段移除Path上的点Path添加
- 二进制数据一般输入的格式是0x45, 0x3a, 0xc3, 这种数据格式看起来是16进制的字符串,但是实际上在存储的时候每个都对应一个字节
- 求数组中最大的数的值:1、数组的max函数:class Program { &nb
- Java停止线程的逻辑(协同、通知)在Java程序中,我们想要停止一个线程可以通过interrupt方法进行停止。但是当我们调用interr
- JSON轻量级的数据交换格式相对于XML来说,JSON的解析速度更快,文档更小。JSON的格式{属性名:属性值,属性名:属性值,……}属性名
- 本文实例讲述了Java模拟QQ桌面截图功能实现方法。分享给大家供大家参考。具体如下:QQ的桌面截图功能非常方便,去年曾用Java模拟过一个,
- 前言在工作总常常需要用到缓存,而redis往往是首选,但是短期的数据缓存一般我们还是会用到本地缓存。本文提供一个我在工作中用到的缓存工具,该
- 一、什么是 javabean ?在jsp页面中,包含html代码、css代码、java代码、以及业务逻辑处理代码等。javabean的作用就
- 在Android中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易、更好地架构系统
- * 验证码地址:https://007.qq.com/online.html* 使用OpenCv模板匹配* 成功率90%左右* Java +
- 建立Android项目,如果会的话特别简单,不会的话让自己去琢磨也需要一定的时间!小编之后将自己学习Android的经验给大家分享出来!1、
- 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据
- 值传递当调用方法进行值传递时,方法内部会产生一个局部变量,在方法内部使用局部变量的值,并不影响传入原来数据的值,包括在使用基本数据类型的包装
- 本文实例讲述了C#实现的微信网页授权操作逻辑封装。分享给大家供大家参考,具体如下:一、微信网页授权登录前提:1.已经获取的接口权限,如果是测
- 本文实例讲述了C#统计C、C++及C#程序代码行数的方法。分享给大家供大家参考。具体如下:本文中的两个函数1)用于统计扩展名为 .h .c
- 目录一 首先我们的去知道什么是反射?二(刨根问底)知道是什么还需要知道什么“成分”组成反射?2.1 Class 对象的获取及使用2.2 拿到
- 在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。下面LZ就其原理、实例
- 说明本文主要配置Jackson对Long、Date、LocalDate、LocalDateTime的序列化和反序列化。由于js中整数可精确表
- 方法一: view.post(Runnable runnable)使用 view 对象,调用 post 方法即可在主线程中执行里边的代码,p