当前位置: 首页 > news >正文

JAVA中的泛型

一、泛型的概念

泛型是JAVA中的一个重要的概念,它允许你在编译时指定数据类型,从而使得代码更加灵活,更加通用。通过泛型,你可以在通用代码上操作不同数据类型,使得代码更加具有通用性。

二、泛型的使用场景

1、泛型接口:

泛型接口允许你定义一个接口,该接口可以应用于不同的数据类型的对象。例如:List是一个接口,但是List可以应用于List、List等。

2、泛型类:

泛型类允许你定义一个类,该类可以应用于不同的数据类型的对象。例如:ArrayList是一个类,但是ArrayList可以应用于ArrayList、ArrayList等。

3、泛型方法:

泛型方法允许你定义一个方法,并在该方法返回值类型前边使用泛型限制,例如:List中的<T> T[] toArray(T[] var1);方法的定义。

4、泛型参数:

泛型参数用来限制方法参数的数据类型,通过泛型参数,可以灵活的处理不同数据类型的参数。例如:List.add可以接收Integer类型的数据,也可以接收String类型的数据。

三、泛型的应用

假设有一个打印场景,传入的打印内容是不确定的,需要根据实际场景去决定,那么此时就需要使用泛型来解决这个问题, 通过泛型,可以定义一个方法,让方法可以接收不同类型的参数

1.1、JavaGenerics.java

/**  * java中的泛型使用:  * 假设有一个打印场景,传入的打印内容是不确定的,需要根据实际场景去决定,那么此时就需要使用泛型来解决这个问题,  * 通过泛型,可以定义一个方法,让方法可以接收不同类型的参数  */  
public class JavaGenerics {  /**  * 测试打印入口:  * 如果不使用泛型,那么需要使用两个方法分别打印字符串和数值,如果想要  * 打印其他类型的时候,那么就需要再定义一个方法,这样就会造成代码冗余  */  @Test  public void testPrint() {  // 单独定义具体的类实现Integer打印  IntegerPrinter integerPrinter = new IntegerPrinter(123);  integerPrinter.print();  // 单独定义具体的类实现String打印  StringPrinter stringPrinter = new StringPrinter("Hello");  stringPrinter.print();  // 单独定义方法实现String打印  printString("Hello");  // 单独定义方法实现Integer打印  printInteger(100);  }  /**  * 测试打印入口:  * 使用了泛型之后,只需要定义一个方法,就可以同时打印字符串和数值,  * 这样就可以解决代码冗余的问题,并且,如果需要打印其他类型,只需要定义一个方法即可,不需要再定义其他方法,  *  */    @Test  public void testGenericsPrint() {  // 只要定义一个类实现,接受一个泛型T,通过传递的T的类型,就可以实现打印不同类型的数据  GenericsPrinter<String> stringGenericsPrinter = new GenericsPrinter<>("Hello");  stringGenericsPrinter.print();  GenericsPrinter<Integer> integerGenericsPrinter = new GenericsPrinter<>(123);  integerGenericsPrinter.print();  // 只要定义一个方法实现,接受一个泛型T,通过传递的T的类型,就可以实现打印不同类型的数据  printGenerics("Hello");  printGenerics(123);  // 使用通配符后,List中的数据类型可以不受限制,可以灵活处理,只要符合通配符的范围即可。  List<Integer> integers = new ArrayList<>();  integers.add(123);  integers.add(456);  printGenerics(integers);  List<String> string = new ArrayList<>();  string.add("123");  string.add("456");  printGenerics(string);  // 这里直接会报错,因为已经限制了GenericsPrinter1传入的泛型T为Number的子类或者本身  // GenericsPrinter1<String> stringGenericsPrinter1 = new GenericsPrinter1<>();  // 这里直接会报错,因为已经限制了GenericsPrinter2传入的泛型T为Number的子类或者本身并且必须是实现了Serializable的子类  // GenericsPrinter2<String> stringGenericsPrinter2 = new GenericsPrinter2<>();  // 第一个参数传入的泛型T必须为Number的子类或者本身并且必须是实现了Serializable的子类  // 第二个参数传入的泛型K没有限制,可以传递String类型也可以传递Integer  GenericsPrinter3<Integer, String> stringGenericsPrinter3 = new GenericsPrinter3<>(123, "hello word");  stringGenericsPrinter3.print();  }  /**  * 打印数值  *  * @param integer 打印数值内容  */  private void printInteger(Integer integer) {  System.out.println("Integer: " + integer);  }  /**  * 打印字符串  *  * @param string 打印字符串内容  */  private void printString(String string) {  System.out.println("String: " + string);  }  /**  * 打印内容:因为T在JAVA中并不是一个类型,只是一个占位符,  * 那么需要明确告诉JAVA这里的T是一个泛型,才能正常编译通过,  * 做法是在方法的返回值前边加上<T>。  *  * @param context 打印内容,这里的T也可以是任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型,  *          并且可以使用extend来进行限制类型。参考GenericsPrinter3的使用  */  private <T> void printGenerics(T context) {  System.out.println("context: " + context);  }  /**  * 打印内容:如果要打印这种List的情况,但是又不想限制List的类型,那么就使用  * 通配符<?>来表示,这样就可以打印List中的任意类型了。  *  * @param context 打印内容,使用通配符<?>来表示,这样就可以打印List中的任意类型了,  *                通配符也可以使用extend和super来表示范围,如:  *                <? extends Number>表示泛型为Number或Number子类的类型,  *                <? super Number>表示泛型为Number或Number父类的类型  */  private void printGenerics(List<?> context) {  System.out.println("context: " + context);  }  
}

1.2、StringPrinter.java

/**  * StringPrinter:专门用于打印字符串的类  */  
public class StringPrinter {  String string;  public StringPrinter(String string) {  this.string = string;  }  public void print() {  System.out.println(string);  }  
}

1.3、IntegerPrinter.java

/**  * IntegerPrinter:专门用于打印整数的类  */  
public class IntegerPrinter {  Integer integer;  public IntegerPrinter(Integer integer) {  this.integer = integer;  }  public void print() {  System.out.println(integer);  }  
}

1.4、GenericsPrinter.java


/**  *  泛型类:泛型类就是将泛型定义在类上,泛型类的类型参数只能被使用在类和接口中  *  * @param <T> 泛型  */  
public class GenericsPrinter<T> {  T context;  public GenericsPrinter(T context) {  this.context = context;  }  public void print() {  System.out.println(context);  }  
}  /**  * 有界限的泛型:限制传入的泛型类型必须继承自Number类  *  * @param <T> 泛型  */  
class GenericsPrinter1<T extends Number> {  T context;  public GenericsPrinter1(T context) {  this.context = context;  }  public void print() {  System.out.println(context);  }  
}  /**  * 有界限的泛型:限制传入的泛型类型必须继承自Number类和Serializable类  * 注意:Number & Serializable顺序不能错,因为不管泛型参数是抽象类还是接口都必须使用extends关键字,  * 否则编译器会报错,由于JAVA的单一继承性,抽象类必须在前边且只有一个,使用&连接多个接口。  *  * @param <T> 泛型  */  
class GenericsPrinter2<T extends Number & Serializable> {  T context;  public GenericsPrinter2(T context) {  this.context = context;  }  public void print() {  System.out.println(context);  }  
}  /**  * 有界限的泛型:可以传递多个泛型参数,  * 注意:Number & Serializable顺序不能错,因为不管泛型参数是抽象类还是接口都必须使用extends关键字,  * 否则编译器会报错,由于JAVA的单一继承性,抽象类必须在前边且只有一个,使用&连接多个接口。  *  * @param <T> 泛型,限制传入的泛型类型必须继承自Number类和Serializable类  * @param <K> 泛型,无限制  */  
class GenericsPrinter3<T extends Number & Serializable, K> {  T context;  K context1;  public GenericsPrinter3(T context, K context1) {  this.context = context;  this.context1 = context1;  }  public void print() {  System.out.println(context.intValue());  System.out.println(context);  System.out.println(context1);  }  
}

相关文章:

JAVA中的泛型

一、泛型的概念 泛型是JAVA中的一个重要的概念&#xff0c;它允许你在编译时指定数据类型&#xff0c;从而使得代码更加灵活&#xff0c;更加通用。通过泛型&#xff0c;你可以在通用代码上操作不同数据类型&#xff0c;使得代码更加具有通用性。 二、泛型的使用场景 1、泛型…...

日撸代码300行:第73天(固定激活函数的BP神经网络,训练与测试过程理解)

进一步梳理理解了一下正向和反向传播。Forward 是利用当前网络对一条数据进行预测的过程&#xff0c;BackPropagation 是根据误差进行网络权重调节的过程。 完整的代码在72天&#xff0c;这里只粘贴Forward和BackPropagation两个方法。 /*** *********************************…...

css中常用单位辨析

辨析 px&#xff1a;像素&#xff1b;css中最普遍最常用的单位&#xff0c;不管在何种设备或分辨率上&#xff0c;1px始终代表屏幕上的一个像素。 %&#xff1a;百分比&#xff1b;基于父元素相对属性的百分比。 em&#xff1a;当前字体大小的倍数&#xff1b;基于父元素字体…...

Unity 一些常用特性收集

常用的类的特性 特性效果[Serializable]可序列化&#xff0c;作为一个子属性显示在Inspector面板[RequireComponent(typeof(CoomponnetName))]该类挂载的游戏物体&#xff0c;需要要有对应的组件[DisallowMultipleComponent]不允许挂载多个该类或其子类[ExecuteInEditMode]允许…...

select实现服务器并发

select的TCP服务器代码 #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/select.h> #include…...

【Spring底层原理】BeanFactory的实现

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 容器实现 一、BeanFactory实现的特点1.1 Be…...

c++---I/o操作

5、文件操作 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放。 我们可以通过文件将数据持久化 C中对文件操作需要包含头文件 <fstream> 文件类型分为两种&#xff1a; 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文…...

UG\NX二次开发 用程序修改“用户默认设置”

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 简介 可以用程序修改“用户默认设置”吗?下面是用代码修改“用户默认设置->基本环境->用户界面->操作记录->操作记录语言”的例子。 效果 代码 #include <uf_defs.h> #include <NXOpen/NXExcept…...

什么是信号处理?如何处理信号?

C语言信号处理详解 第一部分&#xff1a;什么是信号&#xff1f; 信号是一种进程间通信的机制&#xff0c;用于通知进程发生了某种事件或异常情况。在C语言中&#xff0c;信号是一种软件中断&#xff0c;它可以被操作系统或其他进程发送给目标进程。每个信号都有一个唯一的数…...

谈谈 Redis 数据类型底层的数据结构?

谈谈 Redis 数据类型底层的数据结构? RedisObject 在 Redis 中&#xff0c;redisObject 是一个非常重要的数据结构&#xff0c;它用于保存字符串、列表、集合、哈希表和有序集合等类型的值。以下是关于 redisObject 结构体的定义&#xff1a; typedef struct redisObject {…...

九、GC收集日志

JVM由浅入深系列一、关于Java性能的误解二、Java性能概述三、了解JVM概述四、探索JVM架构五、垃圾收集基础六、HotSpot中的垃圾收集七、垃圾收集中级八、垃圾收集高级👋GC收集日志 ⚽️1. 认识GC收集日志 垃圾收集日志是一个重要的信息来源,对于与性能相关的一些悬而未决的…...

SimpleCG动画示例--汉诺塔动画演示

前言 SimpleCG的使用方法在前面已经介绍了许多&#xff0c;有兴趣的同学如果有去动手&#xff0c;制作一些简单动画应该没多大问题的。所以这次我们来演示一下简单动画。我们刚学习C语言的递归函数时&#xff0c;有一个经典例子相信很多同学都写过&#xff0c;那就是汉诺塔。那…...

反弹shell脚本(php-reverse-shell)

平时经常打靶机 这里贴一个 反弹shell的脚本 <?php // php-reverse-shell - A Reverse Shell implementation in PHP // Copyright (C) 2007 pentestmonkeypentestmonkey.net // // This tool may be used for legal purposes only. Users take full responsibility // f…...

XSS-labs

XSS常见的触发标签_xss标签_H3rmesk1t的博客-CSDN博客 该补习补习xss漏洞了 漏洞原理 网站存在 静态 和 动态 网站 xss 针对的网站 就是 动态网站 动态网站会根据 用户的环境 与 需求 反馈出 不同的响应静态页面 代码写死了 只会存在代码中有的内容 通过动态网站 用户体…...

C++简单实现AVL树

目录 一、AVL树的概念 二、AVL树的性质 三、AVL树节点的定义 四、AVL树的插入 4.1 parent的平衡因子为0 4.2 parent的平衡因子为1或-1 4.3 parent的平衡因子为2或-2 4.3.1 左单旋 4.3.2 右单旋 4.3.3 先左单旋再右单旋 4.3.4 先右单旋再左单旋 4.4 插入节点完整代码…...

UE4 Cesium 与ultra dynamic sky插件天气融合

晴天&#xff1a; 雨天&#xff1a; 雨天湿度&#xff1a; 小雪&#xff1a; 中雪&#xff1a; 找到该路径这个材质&#xff1a; 双击点开&#xff1a; 将Wet_Weather_Effects与Snow_Weather_Effects复制下来&#xff0c;包括参数节点 找到该路径这个材质&#xff0c;双击点开&…...

SpringCloud Gateway--Predicate/断言(详细介绍)下

&#x1f600;前言 本篇博文是关于SpringCloud Gateway–Predicate/断言&#xff08;详细介绍&#xff09;下&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以…...

SOC芯片学习--GPIO简介

原创 硬件设计技术 硬件设计技术 2023-07-20 00:04 发表于广东 收录于合集#集成电路--IC7个 一、GPIO定义、分类&#xff1a; GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;&#xff0c;通用型之输入输出的简称&#xff0c;其接脚可以供使用者由…...

skywalking源码本地编译运行经验总结

前言 最近工作原因在弄skywalking&#xff0c;为了进一步熟悉拉了代码下来准备debug&#xff0c;但是编译启动项目我就费了老大劲了&#xff0c;所以准备写这篇&#xff0c;帮兄弟们少踩点坑。 正确步骤 既然是用开源的东西&#xff0c;那么最好就是按照人家的方式使用&…...

K8s架构简述

以部署一个nginx服务说明kubernetes系统各个组件调用关系&#xff1a; 一旦kubernetes环境启动之后&#xff0c;master和node都会将自身的信息存储到etcd数据库中 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件 apiServer组件会调用scheduler组件来决定到底…...

Jetson Orin Nano 升级jetpack5.1.2刷机过程记录

一.刷机起因 orin nano 接了个IMX477的摄像头,用 命令行DISPLAY:0.0 nvgstcapture-1.0 显示的画面有撕裂,让卖家查问题,卖家测试没有撕裂,对比环境,orin nano出厂默认的是jetpack5.1.1,卖家用的jetpack5.1.2版本,为了解决差异,要升级jetpack版本,前后搞了2天半,记录一下. 另外…...

Qwen3-Coder-30B-A3B-Instruct-FP8:终极代码模型对比分析指南

Qwen3-Coder-30B-A3B-Instruct-FP8&#xff1a;终极代码模型对比分析指南 【免费下载链接】Qwen3-Coder-30B-A3B-Instruct-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8 在当今AI代码生成领域&#xff0c;Qwen3-Coder-30B-…...

别再让模型在Unity里‘抽风’了!Blender导出FBX到Unity的7步避坑自查清单

别再让模型在Unity里‘抽风’了&#xff01;Blender导出FBX到Unity的7步避坑自查清单当你花了三天三夜精心雕琢的Blender模型&#xff0c;导入Unity后却变成了一团旋转错乱、贴图闪烁的"抽象艺术"&#xff0c;那种崩溃感每个3D开发者都懂。本文将用实战经验帮你建立一…...

Kerberos身份认证原理与实战排错指南

1. 为什么今天还要花时间搞懂 Kerberos&#xff1f;——一个被低估的“老协议”正在悄悄支撑着你的日常你每天登录公司内网查邮件、访问财务系统提交报销、用 Jenkins 构建代码、甚至在 Windows 域环境中打开一台同事的共享文件夹……这些看似顺滑的操作背后&#xff0c;大概率…...

信息系统项目管理师核心知识点精讲

一、项目整合管理(重点:项目章程与项目管理计划) 知识点详解: 项目整体管理是项目管理知识体系的核心,它确保项目各要素协调统一。在考试中,特别要掌握项目章程和项目管理计划的区别与联系。 项目章程是项目的“出生证明”,由项目发起人发布。它正式授权项目,赋予项…...

ROS Noetic实战:从bag包里‘抠’出雷达点云和IMU数据的保姆级教程(Ubuntu 20.04)

ROS Noetic实战&#xff1a;从bag包里提取雷达点云和IMU数据的完整指南&#xff08;Ubuntu 20.04&#xff09;在机器人开发中&#xff0c;ROS bag文件就像是一个装满珍贵数据的宝箱&#xff0c;而雷达点云和IMU数据则是其中最闪亮的宝石。作为一名长期与ROS打交道的开发者&…...

使用TaotokenCLI工具一键配置开发环境中的API密钥

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken CLI工具一键配置开发环境中的API密钥 在团队协作或个人开发中&#xff0c;为每个项目或成员手动配置大模型API密钥和…...

2026论文降AI怎么挑?亲测好用工具附免费降AI指南

“您的论文AIGC率为42%&#xff0c;超出学校30%的合格线&#xff0c;请修改后重新提交。”赶毕业论文的同学这段时间估计没少收到这样的提醒。2026年知网、万方、维普等主流平台的AI检测算法持续迭代&#xff0c;把AI生成内容改到符合学校要求&#xff0c;已经成了毕业生的刚需…...

毕业设计 yolov11骨折检测医疗辅助系统(源码+论文)

文章目录 0 前言1 项目运行效果2 课题背景2.1 研究背景2.2 国内外研究现状2.3 研究意义 3 设计框架&#xff08;骨折检测系统设计框架说明&#xff09;3.1. 系统架构图3.2. 技术选型3.2.1 核心组件3.2.2 辅助工具 3.3. 核心模块设计3.3.1 YOLO模型训练模块训练流程图关键伪代码…...

基于ESP32的智能电池充电器设计:多化学体系支持与模块化架构

1. 项目概述&#xff1a;打造一台全能的“电池医生”手头攒了一堆不同化学体系的电池&#xff0c;从航模用的4S锂聚合物电池&#xff0c;到应急灯里的12V铅酸电池&#xff0c;再到各种工具里的镍氢、锂离子电池&#xff0c;每次充电都得翻出好几个不同的充电器&#xff0c;桌面…...