泛型的使用(<T>)

news2024/11/18 16:55:41

文章目录

  • 前言
  • 一、泛型是什么?
  • 二、泛型的使用
    • 1.定义泛型类
    • 2.泛型的常规用法
  • 总结

前言

        强制类型转换存在一定隐患,如数据丢失、内存溢出、运行时错误、程序逻辑错误等。所以提供了泛型机制,使程序员可以定义安全的数据类型进行操作。通俗的理解泛型,就是统一成员变量或者实例对象的数据类型,并且保障了其数据类型安全。


一、泛型是什么?

        泛型是一种在编程语言中使用的概念,目的是让代码能够处理多种数据类型,而不仅仅是一种固定类型。通过使用泛型,可以编写更通用和灵活的代码,提高代码的可重用性和可读性。

        在使用泛型时,可以定义一个或多个参数,这些参数可以代表不确定的数据类型。在代码实现中,可以使用这些参数表示各种不同的数据类型,从而实现相同的功能逻辑。

        使用泛型可以避免在代码中重复编写相似的代码,同时还可以减少类型转换的错误和运行时错误。泛型的主要优势是在编译时进行类型检查,可以提前发现错误,而不是在运行时才发现。

二、泛型的使用

1.定义泛型类

        泛型的语法机制如下:

泛型类名<T>

        实操展示:

public class TestDemo<T> {  //定义泛型类
    private T testdemo; //定义泛型成员变量
    
    public void setT(T testdemo){   //设置set定值方法
        this.testdemo = testdemo;
    }

    public T getT(){    //设置get获值方法
        return testdemo;
    }

    //以上代码即,设置成员变量的泛型,使该泛型成员变量数据类型安全
    //以下为此泛型成员变量的使用,先创建实例,然后调用方法,设定或获得泛型成员变量的值
    public static void main(String[] args) {
        TestDemo<Integer> demo = new TestDemo<>();
        TestDemo<Double> demo2 = new TestDemo<>();

        demo.setT(1024);    //设定的Integer值为1024
        Integer integer = demo.getT();
        System.out.println(integer);

        demo2.setT(3.18);    //设定的Double值为3.18
        Double double1 = demo2.getT();
        System.out.println(double1);
        
    }
}

        运行结果:

 

        由图所示,定义泛型时,在泛型类中,创建私有泛型成员变量,通过创建set方法和get方法进行操作变量是常规的做法。 

2.泛型类的常规用法

        (1)定义泛型类时声明多个类型

        在定义泛型类时,可以声明多个类型,这样实例化对象时,可以指定多个类型。具体语法如下:

泛型类名<T1,T2>

         实操展示:

public class TestDemo<T,V> {  //定义泛型类
    private T testdemo; //定义泛型成员变量
    
    public void setT(T testdemo){   //设置set定值方法
        this.testdemo = testdemo;
    }

    public T getT(){    //设置get获值方法
        return testdemo;
    }

    private V testV;

    public void setV(V testV){
        this.testV=testV;
    }

    public V getV(){
        return testV;
    }

    public void set(V testV,T testT){
        this.testV = testV;
        this.testdemo = testT;
    }

    public void get(){
        System.out.println("两个值为:"+testV+"和"+testdemo);
    }
    //以上代码即,设置了两个成员变量的泛型,使该泛型成员变量数据类型安全
    //以下为此泛型成员变量的使用,先创建实例,然后调用方法,设定或获得泛型成员变量的值
    public static void main(String[] args) {
        TestDemo<Integer,String> demo = new TestDemo<>();

        //泛型成员变量T
        demo.setT(12);
        Integer integer = demo.getT();
        System.out.println(integer);

        //泛型成员变量V
        demo.setV("这是一个字符串");
        String string = demo.getV();
        System.out.println(string);
        
        //设置获取两个泛型成员变量
        demo.set("字符串1", 10);
        demo.get();
    }
}

        运行结果:

 

        由上图所示,当定义了多个泛型<T>的泛型类,本质上我们可以在泛型类中定义多个泛型成员变量,可以进行使用。 

        (2)定义泛型类时声明数组类型

        定义泛型类时,也可以声明数组类型。也算是避免了只定义一个泛型时,需要创建多个对象,重复实例化泛型类对象的冗杂。直接实例化一个泛型类对象,然后向数组中赋值即可。

         实操展示:在项目中定义泛型类声明数组类型

public class TestDemo<T> {  //定义泛型类
    private T[] testdemo; //定义泛型成员变量(数组类型·)
    
    public void setT(T[] testdemo){   //设置set定值方法(数组类型)
        this.testdemo = testdemo;
    }

    public T[] getT(){    //设置get获值方法(数组类型)
        return testdemo;
    }

    public static void main(String[] args) {
        TestDemo<Integer> demo = new TestDemo<>();

        //定义泛型数组,成员变量
        Integer integer[] = {1024,512,256,128,64,32,16,8,4,2};  //创建对应类型的数组
        demo.setT(integer); //将该数组放入set方法中,设定值。
        System.out.println("该泛型类数组的值都有:");
        for(int i=0;i<integer.length;i++){
            System.out.println(demo.getT()[i]); //输出泛型数组中包含的各个值
        }

    }
}

        运行结果:

 

         如上代码所示,可以用泛型声明是数组的成员变量,但是不可以使用泛型类型建立数组的实例(使用new关键字的形式),那样的代码时错误的。

        (3)集合类声明容器的元素

         集合类如,ArrayList、HashMap、HashSet等集合类有事可以被泛型化的集合类,在我们学习它们的过程中也会看见。以下是这些集合类泛型的定义:

常用的被泛型化的集合类
集合类泛型定义
ArrayListArrayList<E>
HashMapHashMap<K,V>
HashSetHashSet<E>
VectorVector<E>

        如何使用泛型定义后的集合类请看下面的实操展示(HashMap为例):

import java.util.HashMap;
import java.util.Map;    //导包
public class TestDemo{ 
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();    //使用泛型化集合
        
        for(int i=0;i<10;i++){    //定值
            map.put(i, "学员id:"+10+i);
        }

        for(int i=0;i<map.size();i++){    //取值
            System.out.println(map.get(i));
        }
    }
}

        运行结果:

 

        由于在Java中这些集合已经被泛型化了,所以我们可以直接在主方法中使用“Map<Integer,String> map = new HashMap<>();”这样的语句创建集合实例,然后调用集合的put()和get()方法即可。        


总结

        以上就是泛型使用的简单介绍,泛型提供了安全的数据类型,通过使用泛型,可以在编译时检查数据类型的一致性,从而避免了在运行时可能出现的类型错误。有补充或指正的内容,欢迎读者在评论区中留言。

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

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

相关文章

比较(五)利用python绘制棒棒糖图

比较&#xff08;五&#xff09;利用python绘制棒棒糖图 棒棒糖图&#xff08;Lollipop plot&#xff09;简介 棒棒糖图实际上是修饰后的条形图。当在处理大量的值&#xff0c;并且当这些值都很高时&#xff0c;棒棒糖图就很有用。 快速绘制 基于matplotlib import pandas as…

基于单片机的 LED 花样照明时钟设计

摘要 &#xff1a; 本设计是基于单片机的 LED 花样照明 &#xff0c; 并附加时钟设计 . 单片机也叫微控制器 &#xff08; Micro Control Unit, 简称 MCU &#xff09;&#xff0c; 因其价格低廉 &#xff0c; 功能强大 &#xff0c; 在实际应用中得到广泛认可 . 本设计…

基于单片机的 LED 照明灯智能调光系统设计

摘  要&#xff1a; 社会经济的不断发展&#xff0c;推动了智能化生活的进程&#xff0c;智能调光技术开始广泛应用在生活中&#xff0c;人们也逐渐提高了灯光亮灯率等的要求。基于此&#xff0c;笔者主要设计了基于单片机的 LED 照明灯智能调光系统&#xff0c;希望能够为相关…

remix测试文件测试智能合约

remix内其实也是可以通过编写测试文件来测试智能合约的,需要使用插件自动生成框架以及测试结果。本文介绍一个简单的HelloWorld合约来讲解 安装插件多重检测: (solidity unit testing) 编译部署HelloWorld合约 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0;c…

喜报 | 极限科技获得北京市“创新型”中小企业资格认证

2024年6月20日&#xff0c;北京市经济和信息化局正式发布《关于对2024年度4月份北京市创新型中小企业名单进行公告的通知》&#xff0c;极限数据&#xff08;北京&#xff09;科技有限公司凭借其出色的创新能力和卓越的企业实力&#xff0c;成功获得“北京市创新型中小企业”的…

【SpringBoot Web框架实战教程】06 SpringBoot 整合 Druid

不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。大家好&#xff0c;我是闲鹤&#xff0c;微信&#xff1a;xxh_1459&#xff0c;十多年开发、架构经验&#xff0c;先后在华为、迅雷服役过&#xff0c;也在高校从事教学3年&#xff1b;目前已创业了…

wordpress 付费主题modown分享,可实现资源付费

该主题下载地址 下载地址 简介 Modown是基于Erphpdown 会员下载插件开发的付费下载资源、付费下载源码、收费附件下载、付费阅读查看隐藏内容、团购下载的WordPress主题&#xff0c;一款针对收费付费下载资源/付费查看内容/付费阅读/付费视频/VIP会员免费下载查看/虚拟资源售…

第二证券:股票型ETF持续“吸金” 上半年净流入逾4000亿元

2024年上半年行情收官&#xff0c;A股盈余板块领涨商场&#xff0c;银行指数大涨逾17%&#xff0c;居首&#xff1b;煤炭、公用事业两大职业指数均涨超10%。综合板块跌幅最大&#xff0c;上半年累计跌幅超33%&#xff1b;计算机、商贸零售、社会服务等指数均跌超20%。 在股票型…

周报0624-0701--输入CMP数据的准备

一、代码理解 目的&#xff1a;设计思路&#xff08;根据&#xff09; 【主程序】多进程&#xff0c;linux&#xff0c;tensorflow 随机生成速度模型的显示颜色&#xff0c;位置&#xff0c;大小 训练的多进程安排 创建目录、环境变量&#xff0c;来存储CMP地震数据 定义变量&…

六西格玛培训引领久立特材品质新高度,行业领军再升级

久立特材六西格玛管理项目于6月27 日启动。久立特材作为行业内的领军企业&#xff0c;此次引入六西格玛管理法&#xff0c;旨在进一步提升企业运营效率和产品质量&#xff0c;实现持续改进和卓越运营。 久立特材的高层领导与张驰咨询的资深顾问朱老师共同出席项目启动仪式&am…

DETRs Beat YOLOs on Real-time Object Detection论文翻译

cvpr 2024 论文名称 DETRs在实时目标检测上击败YOLO 地址 https://arxiv.longhoe.net/abs/2304.08069 代码 https://github.com/lyuwenyu/RT-DETR 目录 摘要 1介绍 2.相关工作 2.1实时目标探测器 2.2.端到端物体探测器 3.检测器的端到端速度 3.1.NMS分析 3.2.端到端速度…

百事可乐推出具有视频屏幕和人工智能技术的智能罐头

在最近于法国戛纳举行的国际创意节上&#xff0c;百事公司推出了创新的智能罐头。这些罐头不同于传统产品&#xff0c;它们采用了环绕式3D屏幕&#xff0c;能够展示高清视频内容&#xff0c;为品牌宣传和促销带来了全新的视角。经过两年多的精心研发&#xff0c;这些智能罐成为…

【数据结构与算法】探索数组在堆数据结构中的妙用:从原理到实现

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​​ 目录 一、引言 二、堆的基本概念 &#x1f343;堆的特性 &#x1f343;堆的分类 三、…

Python Tkinter:开发一款文件加密解密小工具

在这个信息泄露风险日益增加的时代&#xff0c;使用文件加密工具对于保护个人隐私和企业机密至关重要。 本文介绍了一款小工具——encryptDecrypt&#xff0c;它不仅提供了一个易于使用的图形界面&#xff0c;简化了加密和解密过程&#xff0c;还确保了数据的安全性&#xff0c…

国产压缩包工具——JlmPackCore SDK说明(一)

一、什么是JlmPackCore SDK &#xff08;1&#xff09;自主可控 JlmPackCore是一套基于我国自主知识产权的核心算法发明专利——杰林码&#xff08;详系请参考《杰林码原理及应用》一书&#xff0c;也可以参考后续发表的相关论文&#xff09;&#xff0c;其中一篇会议论文&…

完全入门C语言

1.C语言 C语言是一门通用的计算机编程语言&#xff0c;广泛应用于底层开发。其设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。有良好的跨平台的特性。 同时C语言还是面向过程的编程语言&#xff0c;…

汇编基础语法

指令格式 1、立即数 一个常数&#xff0c;该常数必须对应8位位图&#xff0c;即一个8位的常数通过循环右移偶数位得到该数&#xff0c;该数位合法立即数 在指令中表示方法&#xff1a;#数字&#xff0c;例如&#xff1a;#100 快速判定是否是合法立即数&#xff1a; 首先将这…

一款可以编辑SVG矢量图形的方法(以桑基图为例)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、svg矢量图片在线绘制网站二、保存SVG格式图片二、修改SVG图片中的字体大小一、svg矢量图片在线绘制网站 提示:有些图不想用代码出图时,可以采用这个网站,无需注册,无VIP: 网站地址https…

FFmpeg视频处理工具安装使用

一、前言 FFmpeg是流行的开源视频处理工具&#xff0c;用于转码、合并、编辑等。以下是安装和使用方法&#xff1a; 二、步骤 1.下载 1.1 ffmpeg下载 官网下载地址 wget https://www.ffmpeg.org/releases/ffmpeg-6.1.1.tar.xz1.2 nasm下载 https://www.nasm.us/pub/nasm/…