泛型的使用(<T>)

文章目录

  • 前言
  • 一、泛型是什么?
  • 二、泛型的使用
    • 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()方法即可。        


总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【postgresql】 基础知识学习

PostgreSQL是一个高度可扩展的开源对象关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;它以其强大的功能、灵活性和可靠性而闻名。 官网地址&#xff1a;https://www.postgresql.org/ 中文社区&#xff1a;文档目录/Document Index: 世界上功能最强大的开源…

GP37-S-N、GP37-S-E、GP37-S-R比例电磁铁驱动放大器

比例阀用电磁铁EP45-C、EP37-E、EP45-G、EP45-N、GP37-3-A、GP37-S-N、GP37-S-E、GP37-S-R在直流12V/24V的电液比例控制系统中与BEUEC比例控制放大器配套使用&#xff0c;共同作用于比例阀的控制。电磁铁输出力通过负载弹簧转换成位移&#xff0c;实现电流-力-位移线性转换&…

嵌入式问题分析思路

BUG解决总体思路: 1.1 定位bug范围及性质 要有效解决问题&#xff0c;首先要缩小范围&#xff0c;集中关注最近的代码变化。这有助于迅速定位可能引入问题的部分&#xff0c;避免无谓的时间浪费。检查最近的代码提交记录和修改日志&#xff0c;找出可能影响现有功能的变更。然…

减肥期间三餐饮食搭配

减肥期间三餐饮食搭配 早起洗漱后早餐前:一杯温水大口喝下,清洁肠道!!! 减肥期间早餐搭配 早餐9点前完成✅ ❤必须喝(纯牛奶、无糖豆浆、无糖酸奶、黑咖啡都可以,四选一) ❤必须吃1~2个鸡蛋 (蒸,煮,煎,炒都可以) ❤必须吃主食 (红薯、玉米、南瓜、紫薯、山药…

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

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

小程序的运行机制、更新机制、生命周期介绍保姆级教程全解

一、小程序运行机制 1. 小程序冷启动 小程序启动可以分为两种情况&#xff0c;一种是冷启动&#xff0c;一种是热启动- 冷启动&#xff1a;如果用户首次打开&#xff0c;或小程序销毁后被用户再次打开&#xff0c;此时小程序需要重新加载启动- 热启动&#xff1a;如果用户已经打…

植物大战僵尸杂交版手机下载与安装全攻略

植物大战僵尸杂交版是一款深受玩家喜爱的策略冒险游戏&#xff0c;以其丰富的植物种类、多样的关卡设计和趣味的玩法著称。本文将为您提供详细的下载与安装教程&#xff0c;帮助您快速上手&#xff0c;享受游戏带来的乐趣。 游戏简介 植物大战僵尸杂交版在传统玩法的基础上&a…

使用React复刻ThreeJS官网示例——keyframes动画

最近在看three.js相关的东西&#xff0c;想着学习一下threejs给的examples。源码是用html结合js写的&#xff0c;恰好最近也在学习react&#xff0c;就用react框架学习一下。 本文参考的是threeJs给的第一个示例 three.js examples (threejs.org) 一、下载threeJS源码 通常我们…

视频监控业务平台LntonCVS国标视频综合管理平台功能及技术优势

随着安防行业的快速进步&#xff0c;传统的视频监控平台正在与先进的技术和互联网技术融合&#xff0c;包括5G通信、GIS、大数据、云计算、边缘计算、AI识别、智能分析和视频直播等。这些技术的整合形成了综合性视频监控管理平台&#xff0c;具备集中管理、多级联网共享、互联互…

中霖教育怎么样?税务师通过率高吗?

中霖教育怎么样?税务师通过率高吗? 我们在税务师考试培训方面有着不错的成绩&#xff0c;这都是老师与学员共同努力的结果。 采用小班教学模式&#xff0c;确保每位学员都能得到足够的关注和指导&#xff0c;在学习过程中针对学员的薄弱环节进行专项突破。 因为大部分学员…

Soul探索未来智能互动模式,人机交互重塑社交元宇宙体验

在当今快速发展的科技领域中,人机交互已成为一个备受关注的话题。随着人工智能和机器学习技术的不断进步,人们与计算机和智能设备之间的互动方式正在发生翻天覆地的变化。这种交互不止局限于键盘和鼠标,更涵盖了语音识别、手势控制、虚拟现实等多种形式。人机交互的创新不仅提高…

什么样的网工才是有前途的?

最近整个就业市场的变化&#xff0c;搞得人心惶惶。 可能很多朋友都在思考这样一个问题&#xff1a;现在做网工还有前途吗&#xff1f;什么样的网工才是有前途的&#xff1f;考HCIE认证还来得及吗&#xff1f; 作为网络工程师&#xff0c;该如何确保自己的职业发展方向正确&a…

Linux[高级管理]——Squid代理服务器的部署和应用(反向代理详解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月24日11点11分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— Squid的几种模式…

咖啡消费旺季到来 为何想转让的库迪联营商却越来越多

文 | 智能相对论 作者 | 霖霖 去年还在朝“三年万店”计划狂奔的库迪&#xff0c;今年已出现明显“失速”。 早在今年2月&#xff0c;库迪就官宣其门店数已超过7000家&#xff0c;如今4个多月过去&#xff0c;据极海品牌监测数据显示&#xff0c;截至6月27日&#xff0c;其总…

数据库断言-数据库连接池

原因&#xff1a;现在的代码是单线程&#xff0c;如果遇到大并发的话就会崩溃&#xff0c;数据库查询就查不过来 措施&#xff1a;需要建立数据库连接池&#xff0c;可以设置连接池的数量 什么是大并发&#xff1a;很多客户端在idea写的程序和数据库建立连接 步骤&#xff1…

C++中的类型转换操作符:static_cast reinterpret_cast const_cast dynamic_cast

目录​​​​​​​ C语言中的类型转换 C中的类型转换 C中的类型转换操作符 static_cast reinterpret_cast const_cast volatile关键字 赋值兼容 dynamic_cast C语言中的类型转换 基本概念&#xff1a;赋值运算符左右两侧类型不同&#xff0c;或形参与实参类型不匹配…

数学知识——欧拉函数

数学知识&#xff08;二&#xff09; 20240628 求和N互质的个数公式 先分解N&#xff0c;再求个数fai n欧拉函数的证明&#xff1a;用容斥原理 不考 求质因子 p1, … , pk 1-N中与N互质的个数&#xff0c; 去掉质因子倍数 是pi的倍数的有N/pi个&#xff0c;但是会有既是p1也是…

计算机人说学校-南京大学-计算机方向

1. 专长、特点与特色 南京大学计算机专业在国内外享有很高的声誉&#xff0c;其专长、特点和特色主要体现在以下几个方面&#xff1a; 理论性强&#xff1a;重视数学、逻辑、数据结构、算法、电子设计、计算机体系结构和系统软件等方面的理论基础和专业技术基础。实践性强&am…

大厂10余年经验总结,用户研究领域入门标准书籍来了!

《用户研究方法&#xff1a;卓越产品和服务的用户研究技巧》一书近期出版&#xff0c;本书是用户研究领域入门标准书籍&#xff0c;是一本带你进入用户研究世界&#xff0c;通过研究用户让您工作更出色的书籍。 内容及特色 本书共 10 章&#xff0c;分为三篇。 第一篇&#xf…

Qt实现手动切换多种布局

引言 之前写了一个手动切换多个布局的程序&#xff0c;下面来记录一下。 程序运行效果如下&#xff1a; 示例 需求 通过点击程序界面上不同的布局按钮&#xff0c;使主工作区呈现出不同的页面布局&#xff0c;多个布局之间可以通过点击不同布局按钮切换。支持的最多的窗口…