泛型的使用(<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值为1024Integer integer = demo.getT();System.out.println(integer);demo2.setT(3.18);    //设定的Double值为3.18Double 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<>();//泛型成员变量Tdemo.setT(12);Integer integer = demo.getT();System.out.println(integer);//泛型成员变量Vdemo.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.mzph.cn/pingmian/38631.shtml

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

相关文章

CEPH 系统盘挂了,如何使用数据盘恢复

硬盘损坏是早晚的时&#xff0c;CEHP数据盘坏了&#xff0c;使用CEPH的基本都轻车熟路了&#xff0c;如果系统盘坏了呢&#xff1f;不知道的可能会采取整个系统盘全做的方式 前提条件&#xff1a;使用cephadm搭建集群 如果换服务器&#xff0c;请确保CEPH数据盘放到其它服务器上…

Python基础教程——一次搞懂 Python 字典!Python字典的20种神奇用法

Python 字典&#xff08;Dictionary&#xff09;是数据结构中的一种重要类型。它以键值对的形式存储数据&#xff0c;具有快速查找的特性。今天我们将通过生动有趣的案例&#xff0c;来探讨字典的20个经典操作&#xff0c;帮助大家深入理解和掌握这些概念。 1. 创建字典 字典…

Python从0到100(三十四):Python中的urllib模块使用指南

1. urllib模块概述 在Python中&#xff0c;除了广泛使用的requests模块之外&#xff0c;urllib模块也是处理HTTP请求的重要工具。urllib模块在Python 2中分为urllib和urllib2两个模块&#xff0c;而在Python 3中&#xff0c;它们被合并为一个urllib模块。本文将重点介绍Python…

【鸿蒙学习笔记】Column迭代完备

属性含义介绍 Column({ space: 10 }) {Row() {Text(文本描述).size({ width: 80%, height: 60 }).backgroundColor(Color.Red)}.width(90%).height(90).backgroundColor(Color.Yellow) } .width(100%) // 宽度 .height(200) // 高度 .backgroundColor(Color.Pink) // 背景色 .…

pcap包常见拆分方法

文章目录 Wireshark 拆分流量包SplitCap使用简介魔数报错示例结果 在进行流量分析时&#xff0c;经常需要分析pcap流量包。但是体积过大的流量包不容易直接分析&#xff0c;经常需要按照一定的规则把它拆分成小的数据包。 这里统一选择cic数据集里的Thursday-WorkingHours.pcap…

二、 操作系统知识(考点篇)

一、操作系统概述 操作系统定义&#xff1a; 能有效地组织和管理系统中的各种软/硬件资源&#xff0c;合理地组织计算机系统工作流程&#xff0c;控制程序的执行&#xff0c;并且向用户提供一个良好的工作环境和友好的接口。 操作系统有三个重要的作用&#xff1a; 第一&am…

【办公软件使用分享—Word篇】实用技巧 一学就会 沈阳电脑办公软件基础培训

在平时的工作学习中&#xff0c;Word真真是让很多人头疼的一件事&#xff0c;今天给大家分享20个案例&#xff0c;感受下Word真正的力量&#xff01; 1.插入自动目录 没有目录的文档不是一份合格的文档&#xff0c;很多人认为在Word里插入目录是一件很麻烦的事&#xff0c;其…

Soul打造安全社交元宇宙环境,全力守护用户线上社交安全

在数字化时代的浪潮中,智能安全线上社交正成为人们日常生活中的重要组成部分。随着人们对社交媒体和在线平台依赖程度的不断增加,保障个人信息安全和网络安全变得至关重要。在此背景下,社交平台致力于采取多种措施来保障用户的隐私安全,提升社交体验的质量和安全性。而Soul全方…

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

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

[Shell编程学习路线]——shell脚本中case语句多分支选择详解

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月21日16点30分 &#x1f004;️文章质量&#xff1a;95分 ————前言———— 在Shell编程中&#xff0c;处理多种条件…

基于人脸68特征点识别的美颜算法(一) 大眼算法 C++

1、加载一张原图&#xff0c;并识别人脸的68个特征点 cv::Mat img cv::imread("5.jpg");// 人脸68特征点的识别函数vector<Point2f> points_vec dectectFace68(img);// 大眼效果函数Mat dst0 on_BigEye(800, img, points_vec);2、函数 vector<Point2f&g…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-38实战Kaggle比赛:图像分类 (CIFAR-10)

38实战Kaggle比赛&#xff1a;图像分类 (CIFAR-10) 比赛链接&#xff1a;CIFAR-10 - Object Recognition in Images | Kaggle 导入包 import os import glob import pandas as pd import numpy as np import torch import torchvision from torch.utils.data import Dataset…

R语言数据分析案例39-合肥市AQI聚类和多元线性回归

一、研究背景 随着全球工业化和城市化的迅速发展&#xff0c;空气污染问题日益凸显&#xff0c;已成为影响人类健康和环境质量的重大挑战。空气污染不仅会引发呼吸系统、心血管系统等多种疾病&#xff0c;还会对生态系统造成不可逆转的损害。因此&#xff0c;空气质量的监测和…

MySQL高阶:事务和并发

事务和并发 1. 事务创建事务 2. 并发和锁定并发问题 3. 事务隔离等级3.1 读取未提交隔离级别3.2 读取已提交隔离级别3.3 重复读取隔离级别3.4 序列化隔离级别 4. 死锁 1. 事务 事务&#xff08;trasaction&#xff09;是完成一个完整事件的一系列SQL语句。这一组SQL语句是一条…

经典小游戏(一)C实现——三子棋

switch(input){case 1:printf("三子棋\n");//这里先测试是否会执行成功break;case 0:printf("退出游戏\n");break;default :printf("选择错误&#xff0c;请重新选择!\n");break;}}while(input);//直到输入的结果为假&#xff0c;循环才会结束} …

go Channel原理 (二)

Channel 设计原理 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存。 在主流编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存。 Go 可以使用共享内存加互斥锁进行通信&#xff0c;同时也提供了一种不同的并发模型&#xff0c;即通…

error: Sandbox: rsync.samba in Xcode project

在Targets 的 Build Settings 搜索&#xff1a;User script sandboxing 设置为NO

python课程设计作业-TCP客户端-服务端通信

说明文档 目录 小组成员分工 作品功能介绍 使用的工具和方法 设计的步骤 课程设计中遇到的问题 结论 1. 小组成员分工 本次课程设计由以下小组成员完成&#xff1a; xxx 2. 作品功能介绍 本次课程设计的作品是一个简单的基于 TCP 协议的客户端-服务端通信示例。通过这个示…

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

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

阿里云centos7.9 挂载数据盘到 www目录

一、让系统显示中文 参考&#xff1a;centos7 怎么让命令行显示中文&#xff08;英文-&#xff1e;中文&#xff09;_如何在命令行中显示中文-CSDN博客 1、输入命令&#xff1a;locale -a |grep "zh_CN" 可以看到已经存在了中文包 2、输入命令&#xff1a;sudo vi…