java—泛型编程

news2024/12/25 13:05:23

文章目录

  • 什么是泛型
    • 为什么需要泛型
  • 泛型的使用
    • 泛型的上界
  • 泛型方法的使用
    • 引出泛型方法
  • 泛型是如何编译的
    • 擦除机制

什么是泛型

首先什么是泛型呢?从字面上我们可以理解为广泛的类型,有一定c++基础的程序猿们应该了解,java中的泛型其实就是c++的模板但是使用起来比模板更加简单,那么没有c++基础的呢也没关系,其实泛型它在我们未来的编程中是经常使用的,我们在未来中呢其实并不知道某个方法或者属性应该用一个什么类型,比如说我要你实现一个类这个类里面要有个数组这个数组可以存储任何类型的变量,你应该怎么存储呢?

为什么需要泛型

正如上面所说我们在实际开发的时候很多时候都无法确定我们需要的类型是什么,这时候就需要使用到泛型了。那么泛型究竟应该如何使用呢?我们按照上面的列子来进行阐述

泛型的使用

class MyClass<T>{
    public int a;
    public T  b;
    public MyClass(int p,T b){
        a=p;
        this.b=b;
    }
}
public class Main {
    public static void main(String[] args) {
        MyClass<Integer>m1=new MyClass<>(10,1);
        MyClass<Integer >m2=new MyClass<>(10,2);
        MyClass<String>m3=new MyClass<>(10,"hello");
    }
}

那么看一下上面的代码我们逐步来进行解析,首先就是泛型的使用格式是

class ClassName<T>{

}

这个T也可以是E或者M任意字符都可以甚至可以是多个字符,这个T就是未来我们要实列化初的类型那么泛型类在实例化对象的时候该怎么实例化呢?

ClassName c<Integer>=new ClassName<>();

那么<>括号括起来的其实就是我们这个T要实例化出的对象名称了。那么有了这些基础我们来写一下上面提出的那个问题那就是写一个类,类中包含一个数组这个数组可以存储任意类型的数据。

class MyArrar<T>{
    public Object[] object;
    public MyArrar(int n){
        object=new Object[n];
    }
}

那么上面这个类就是我们实现的可以存储任意类型的数组了那么有些同学可能会有疑惑那这个跟T也没有任何的关系啊说这里用的是Object而不是T,其实这跟编译器运是有关系的我们也可以用T但是用T的话后面会面临很多的问题,因此我们跟源码保持一致就用Object。然后呢构造方法就是为了实列化出我们需要多大的数组空间。然后我们来写一下插入方法。
代码如下

class MyArrar<T>{
    public Object[] object;
    public MyArrar(int n){
        object=new Object[n];
    }
    public void add(int pos,T value){
        object[pos]=value;
    }
}

为什么这里直接用一个等于就可以插入成功了呢?因为泛型有个前提条件就是,泛型必须得是一个类,因此我们讲过Objec是所有类的父类因此,这里可以直接进行等于号。
那么现在我又提出一个要求那就是找到这个数组中的最大值该怎么寻找呢?那么这时候就引出我们下一个知识点叫做泛型的上界。

泛型的上界

什么是泛型的上界呢?上界大家其实就可以理解为上行界限我们通过代码来进行描述

class Myclass2<T extends Integer>{
    
}

其实就是这样在模板后面加上一个extends再加上一个固定的类型即可那么这个表示什么意思呢?其实就是表示这个模板的类型T只能是Integer这个类型或者是继承了这个类型的派生类这个就是泛型的上界,那么回到我们最初的那个问题中,我们应该怎么去找到这个数组中的最大值呢?其实很简单我们既然想找到数组中的最大值也就是说这个类型必须得是可以比较的类型,那么既然可以比较也就是说必须实现了compareTo这个方法,并且我们在写的时候必须指明这个类是comparable(可比较的)。代码如下

class MyArrar<T extends Comparable<T>>{
    public Object[] object;
    public MyArrar(int n){
        object=new Object[n];
    }
    public void add(int pos,T value){
        object[pos]=value;
    }
    public T findMax(){
        T max=(T)object[0];
        for(int i=0;i<object.length;i++){
            if(compareTo(max,object[i])==-1){
                max=(T)object[i];
            }
        }
        return max;
    }
    public int compareTo(T max,Object object){
        return max.compareTo((T)object);
    }
}

那么这里的方法调用顺序是什么样子的呢如下图
在这里插入图片描述

泛型方法的使用

引出泛型方法

这里给大家出一个问题那就是大家想想有没有这样一个方法就是它可以找到任何数组中的最大值。请记住是任何数组。
那么该怎么去实现这个方法呢?其实就是用泛型方法。那个格式如下

public<T,E,f....> T method_Name(){

}

那么上面那个问题该如何实现呢?我们把这个方法单独放入一个类中来实验一下吧。

class Mytest2{
    public<T extends Comparable<T>> T findMax(T[] arg){//这里由于我们要找到一个——
    //最大值因此我们传入的泛型中必须满足可以进行比较的。
        T max=arg[0];
        for(int i=0;i<arg.length;i++){
            if(max.compareTo(arg[i])==-1){
                max=arg[i];
            }
        }
        return max;
    }
}

泛型是如何编译的

擦除机制

这里要将一下擦除机制,泛型的编译时怎么进行的呢?就是擦除机制在编译过程中JVM通过你传入的类型从而将每个T进行一个擦除替代,那么写道这里想必大家也明白了其实为什么我们写一个***extends Comparable <T>***那么这个T就可以使用comapreTo方法了因为这个代码其实就是告诉编译器我这里这个T肯定是实现了comparaTo的。是可以进行比较的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1460864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#_索引器

索引器的作用&#xff1a;令对象可像数组一般被索引 索引器 internal class TestClass {public int[] arr { 1, 2, 3, 4, 5 };public string this[int index] // 前者为返回类型&#xff0c;后者为索引类型// 返回类型代表get函数的返回值类型、set函数的value类型&#xff0…

java 使用documents4j将XML转为pdf文件的方式

1.背景&#xff1a; 通过spire.doc.free将word转换成PDF时存在缺陷&#xff1a;只能获取前3页。获取全文另外需支付费用。 2.解决办法 使用documents4j&#xff0c;documents4j会保留原word文件中更多的样式&#xff0c;如修订模式下的差异化字体颜色、文档右侧修订记录等。 …

PHP实践:Laravel中事件使用讲解

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

js设计模式:适配器模式

作用: 可以将某种不同格式的数据转化为自己所期待的数据格式 或者对于一些存在兼容或者特殊处理的业务逻辑,可以进行一个适配 示例: //原始数据let oldData1 [{name: 王惊涛,age: 29},{name: 孙悟空,age: 800},{name: 嘉文四世,age: 27},{name: 关羽,age: 40},{name: 伊利丹…

【Oracle】玩转Oracle数据库(三):数据库的创建和管理

前言 嘿&#xff0c;各位数据库小能手们&#xff01;今天我们要进入数据库的创世纪&#xff0c;探索Oracle数据库的创建和管理&#xff01;&#x1f527;&#x1f4bb; 在这篇博文【Oracle】玩转Oracle数据库&#xff08;三&#xff09;&#xff1a;数据库的创建和管理中&#…

判断一个dll/exe是32位还是64位

通过记事本判断&#xff08;可判断C或者C#&#xff09; 64位、将dll用记事本打开&#xff0c;可以看到一堆乱码&#xff0c;但是找到乱码行的第一个PE&#xff0c;如果后面是d?则为64位 32位、将dll用记事本打开&#xff0c;可以看到一堆乱码&#xff0c;但是找到乱码行的第…

第二证券:可转债怎么套利?可转债常见的六种套利方法

可转债是上市公司为了融资向社会公众所发行的一种债券&#xff0c;其间投资者可以在二级市场上进行套利操作&#xff0c;存在以下六种套利办法&#xff1a; 1、折价转股套利 只有在溢价率为负时&#xff0c;可转债才有套利空间&#xff0c;转股溢价率为正&#xff0c;则不存在…

SmartBi--配置BI启动为后台服务

目录 1. 在service.bat目录下打开cmd 2. 运行 service.bat install 服务名 命令 3.在服务中找到设置的服务名&#xff0c;设置成自启&#xff0c;启动服务即可 4.在tomcat logs目录下查看日志 5. 移除服务 1. 在service.bat目录下打开cmd 2. 运行 service.bat install …

短视频内容如何吸引用户?媒介盒子揭秘

不管是什么行业&#xff0c;在宣传中都会用到短视频这种类型&#xff0c;然而有许多品牌方在宣传时总会面临找不着发力点&#xff0c;宣传内容同质化等问题&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;什么样的短视频内容能够吸引用户。 一、 制造强烈对比&#xff0c…

python 批量创建的目录和文件、同时写入文件内容、为短视频做基础模板准备

图&#xff1a; 代码&#xff1a; import os def create_directory(path):if not os.path.exists(path):os.makedirs(path)print("已创建目录&#xff1a;", path)else:print("该路径下已存在相同名称的目录")def create_file(filename):with open(filena…

柔顺控制笔记

参资料&#xff1a; 【1】https://zhuanlan.zhihu.com/p/620918453 【2】https://blog.csdn.net/a735148617/article/details/108564836 【3】https://zhuanlan.zhihu.com/p/126338809 【4】机器人与环境间力_位置控制技术研究与应用_李正义 【5】水下机械臂建模及柔顺控制方法…

【快速搞定Webpack5】处理字体图标资源(六)

介绍 在实际开发中&#xff0c;几乎每个项目都需要用户icon图标以及部分项目会用到有特色的字体需求。 今天我们学习的内容就是如何在webpack中处理字体及icon图标的使用。 一、下载字体图标文件 1、打开 阿里巴巴矢量图库 2、登录或注册账号 3、选择想要的图标添加到购物车…

04 动力云客之登录后获取用户信息+JWT存进Redis+Filter验证Token + token续期

1. 登录后获取用户信息 非常好实现. 只要新建一个controller, 并调用SS提供的Authentication对象即可 package com.sunsplanter.controller;RestController public class UserController {GetMapping(value "api/login/info")public R loginInfo(Authentication a…

ipad作为扩展屏的最简单方式(无需数据线)

ipad和win都下载安装toDesk&#xff0c;并且都处于同一局域网下 连接ipad&#xff0c;在ipad中输入win设备的设备密码和临时密码&#xff0c;连接上后可以看到ipad会是win屏幕的镜像&#xff0c;此时退出连接&#xff0c;准备以扩展模式再次连接。 注意&#xff0c;如果直接从…

Devvortex

目标靶机 攻击机IP地址为10.10.16.2 信息收集 # nmap -sT --min-rate 10000 -p- 10.10.11.242 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-21 10:32 CST Warning: 10.10.11.242 giving up on port because retransmission cap hit (10). Nma…

FPGA高端项目:FPGA实现SDI视频编解码工程解决方案,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI图像缩放应用本方案的SDI图像缩放视频拼接应用本方案的SDI图像缩放UDP网络视频发送应用本方案的SDI视频编码输出应用本方案的SDI视频编码图像缩放视频拼接输出应用本方案的SDI视频编码SFP光口收发应用…

如何在Ubuntu部署Emlog,并将本地博客发布至公网可远程访问

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

Flask数据库操作-Flask-SQLAlchemy

Flask中一般使用flask-sqlalchemy来操作数据库。flask-sqlalchemy的使用介绍如下&#xff1a; 一、SQLAlchemy SQLALchemy 实际上是对数据库的抽象&#xff0c;让开发者不用直接和 SQL 语句打交道&#xff0c;而是通过 Python 对象来操作数据库&#xff0c;在舍弃一些性能开销…

ASO专家绝不会分享的高级应用商店优化秘密!(2)

上回我们讨论了“推广应用内购买、实施应用内事件、如果使用特殊字符&#xff0c;请勿使用全部 30 个字符、新的评级是应用商店优化的货币、 在 Google Play 上&#xff0c;评论中的关键词很重要”等五个方面的内容&#xff0c;接下来小柚将继续和大家分享一些更细节的部分。 …

护眼台灯哪家品牌好?盘点全网五大爆款

护眼台灯能比较好的改善学习环境光线&#xff0c;尤其是现在孩子的近视率比较高&#xff0c;所以特别多家长都会给孩子准备上一盏台灯。但是也有一些消费者反馈护眼台灯购买后的体验不尽人意&#xff0c;甚至使用中还会出现很多负面影响&#xff0c;特别是新闻报道关于护眼台灯…