说说泛型

【泛型】Java中的泛型,泛型类,泛型接口,泛型方法,泛型擦除 这篇文章总结一下Java中的泛型相关知识点,包括:泛型概念、泛型优缺点、泛型通配符、泛型上下界、泛型使用(泛型类、泛型接口、泛型方法)、泛型擦除等内容。 一、泛型概念 (1)什么是泛型 什么是泛型??? 泛型(Generic),是一种参数化数据类型,它允许我们在编写程序代码的时候不用具体指定需要什么数据类型,而是等到具体使用的时候,将数据类型以参数的形式传递给程序,这就是泛型程序设计。 (2)为什么需要泛型 我们来看看下面这个栗子 假设现在有个需求,通过集合保存元素,需要保存String字 阅读详情

引子

最近在重构代码,发现很多情况下,抽取基类,都离不开泛型这个知识点,用好泛型,是重构代码的第一步

子类限定和超类限定 看这里

什么是泛型

当你想要定义一个基类,或者是通用的类、接口、方法时,你还不知道以后的使用者要往里面传入什么类型的对象,这时候,你就不能把这个数据类型写死了,写死了就不具有扩展性、通用性,就不能称之为基(通用)了。这时候你就需要泛型了。

当然,你会问,我不知道要传入什么类型,我直接写个Object类型不就行了吗,这样不是不行,但是这样极易产生《强制转换异常》,

而且这个《强制转换异常》属于运行时异常,编译期间你不会发现错误,只有在运行时,才会报错,

泛型的经典定义:
泛型,就是,一种把 明确数据类型的工作,放在了创建对象,或者调用方法时候 进行的特殊类型。

泛型用(声明)在什么位置

  1. 方法上,在调用方法时候,明确数据类型 方法返回值之前
  2. 类上,在new 对象时候,明确数据类型 类名之后
  3. 接口上,在实现接口(或者在new 接口的实现类的)时候,明确数据类型接口名之后

< T >:表示声明泛型
T: 表示使用泛型
T:只能是引用类型,不能是基本类型(自动装包了int–>Integer)

方法上声明泛型

public class Tool {
    /**
     * 1.在方法上使用泛型
     * 这是一个输出语句的方法
     * 但是我们在定义这个方法时候,还不确定要输出什么类型的对象
     * 有可能要输出一个int类型,也有可能是String类型,或者是boolean类型
     * 那么这里我们就不能把这个类型定死了,应该用一个“泛型”
     * ok,我们在形参里面写(T t),就表明了,调用者可以输入任意类型的对象
     * 问题来了,你平白无故来了个T,谁知道这个T是什么呢
     * 就像是你直接来了个变量i,上来就i=0,这样是不行的,你应该先声明这个变量:int i;
     * 然后你才可以使用这个i,类比到泛型上
     * 你想使用泛型T,那么首先你应该声明这个泛型T,如何声明呢
     * 很简单,只要在方法返回值前面写一个T即可(这里说的是方法上使用泛型的情况)
     * @param t  形参的泛型对象
     * @param <T> 声明泛型在方法上
     */
    public <T> void show(T t) {
        System.out.println(t);
    }
}

在调用这个方法时,你可以传入任意的对象了

 Tool tool = new Tool();
/**
 *这时候数据类型是在使用方法时才明确的,
 *所以你传入什么数据类型,就使用什么数据类型,
 *是不是很方便,使用的时候在确定数据类型
**/
 tool.show(100);
 tool.show("hello");
 tool.show(true);
 tool.show(new Date());
 tool.show('A');
 tool.show(85.7);
 tool.show(new Byte("100"));
 tool.show(new Character('C'));

类上声明泛型


/**
 * 泛型声明在类上
 * @param <T> 声明泛型在类上
 */
public class Tool1 <T>{
//泛型T在类或者接口上声明过,就不需要在方法上声明了
    public  void show(T t) {
        System.out.println(t);
    }
}

使用这个泛型类


        Tool1<String> tool1=new Tool1<>();
//      因为你在new对象时就确定了要传入的数据类型是String,
//      所以你在这里传入Integer,就直接报错,
//      是不是把运行时异常提前到编译期间了
//        tool1.show(100);
        tool1.show("hello");
//      还是那个Tool1<T>泛型类,这次你new对象时候,指明了明确的数据类型Integer
        Tool1<Integer> tool11=new Tool1<>();
        tool11.show(100);//不能再传String了

接口上声明泛型

接口上声明泛型有两种情况
1. 接口上声明了泛型,在创建该接口的实现类时,明确了泛型的具体类型
2. 接口上声明了泛型,在创建该接口的实现类时,还未明确泛型的具体类型,而是在new 实现类时,才明确泛型的具体类型

先定义一个泛型接口

/**
 * 泛型声明在接口上
 * @param <T> 声明泛型在接口上
 */

interface  ToolInter<T> {

    public void show(T t);
}
第一种情况

在创建该接口的实现类时,明确了泛型的具体类型
实现类

/**
 * 由于在创建实现类时,就明确了泛型的具体类型
 * 所以在该类下,所有使用该泛型的地方,都同时明确了数据类型
 * 注意:只需在接口名称后面跟上<具体的数据类型>
 */

public class ToolImpl implements ToolInter<String>{
    @Override
    public void show(String s) {
        System.out.println(s);

    }
}

使用之

       //由于ToolImpl已经明确了数据类型为String,这里就不需要再次指定数据类型了
        ToolImpl toolImpl = new ToolImpl();
        //而这个方法的泛型,也在ToolImpl里面就已经明确了,只能是String
        toolImpl.show("hello");
第二种情况

在创建该接口的实现类时,还未明确泛型的具体类型,而是在new 实现类时,才明确泛型的具体类型

实现类


/**
 * 由于在创建实现类时,还没有明确了泛型的具体类型
 * 所以在该类下,所有使用该泛型的地方,都还没有明确具体数据类型
 * 注意:
 * 1.在接口名称后面跟上<泛型T>
 * 2.在实现类名称后面跟上<泛型T>
 * 3.在方法上使用泛型T,泛型T在类或者接口上声明过,就不需要在方法上声明了
 */

public class ToolImpl1<T> implements ToolInter<T>{

    @Override
    public void show(T t) {
        System.out.println(t);

    }
}

使用之

   //由于ToolImpl1还没有明确了数据类型,所以在这里必须指定具体的数据类型
        ToolImpl1<String> toolImpl1 =new ToolImpl1<>();
        //而这个方法的泛型,也在上一步new ToolImpl1明确了是String,
        // 所以方法的具体类型只能是String
        toolImpl1.show("toolImpl1");

泛型的使用也就是以上的三种情况了

无人机巡检提速3倍!YOLOv8n+OpenVINO让Jetson Nano跑25FPS,还能多飞25分钟 摘要(149字): 针对无人机巡检中Jetson Nano算力不足导致的帧率低、首次推理延迟高、续航短等问题,提出YOLOv8n+OpenVINO联合优化方案: 模型轻量化:YOLOv8n参数量仅3.2M(较v8s减少71%),Jetson Nano帧率从8FPS提升至15FPS(原生),绝缘子裂纹召回率仅降3%; OpenVINO加速:AUTO模式动态分配CPU/GPU算力,首次推理延迟从500ms降至200ms,帧率再优化至25FPS; 能效提升:功耗降低40%,单次续航延长25分钟。方案已落地电力/林 阅读详情

相关推荐

什么是泛型

什么是泛型

程序员思维的博客 2940

深入解析Incapsula reese84的生成机制与绕过策略

本文深入解析了Incapsula reese84的生成机制与绕过策略。reese84是一种基于客户端JavaScript挑战的Web安全防护,通过动态算法收集浏览器指纹并生成令牌Cookie。文章详细拆解了其两步验证流程,并提供了使用无头浏览器、逆向JS模拟请求以及Token维护等实战绕过方法,帮助开发者和安全研究人员应对自动化访问拦截。

weixin_29256771的博客 443

说⼀说你对泛型的理解

泛型在Java中广泛用于提高代码的复用性、类型安全性和可维护性。它通过类型参数使得类、方法和接口能够处理不同类型的数据。在使用泛型时,通配符和上/下界通配符提供了更多的灵活性,使得代码更加通用和强大。

阿鹏的博客 612

ZYNQ-Video out IP与Video Timing Controller IP协同工作模式解析

本文深入解析了ZYNQ平台上Video out IP与Video Timing Controller IP的协同工作模式,详细介绍了它们的架构、工作原理及配置要点。通过AXI4-Stream接口实现高效视频数据传输,并结合HDMI输出系统设计实践,为开发者提供了实用的调试技巧和性能优化建议。

redis7keeper的博客 637

《UVM实战》学习笔记——第三章UVM基础

uvm基础,常见的派生类,config db机制,打印信息等

qq_42135020的博客 5177

通俗地解释一下什么是泛型?

泛型,“泛”就是广泛的意思,“型”就是数据类型。顾名思义,泛型就是适用于多种数据类型的一种类型,通常用Object来定义,理论上它可以存放任何类型的数据。 如果我们学过数组的话应该就会知道,数组里面存放的都是相同的数据类型,比如整型、浮点型,那么我们使用Object来定义一个数组,是不是就可以用来存放不同数据类型的数据了呢? class MyArray{ public Object[] array=new Object[10]; } 这个数组可以存放十个Object类型的数据,我们再写一个

MacondoMayor的博客 4949

OrCAD Capture CIS 17.4 原理图绘制

OrCAD Capture CIS 17.4 原理图绘制

qq_38960013的博客 7634

说说你对泛型的理解

泛型是Java中的一个特性,它允许我们在定义类、接口或方法时使用类型参数,以实现代码的通用性和安全性。通过使用泛型,我们可以编写可重用的代码,可以在不同的数据类型上执行相同的操作。在使用泛型集合类时,不需要进行强制类型转换,可以直接获取正确的数据类型,提高了代码的可读性和维护性。泛型可以增加代码的可读性和可维护性。通过使用泛型,我们可以明确指定数据类型,并在代码中表达清晰,使得其他开发人员更容易理解代码的意图和功能。这种类型检查是在编译时进行的,避免了一些常见的运行时类型异常,减少了错误的可能性。

越努力越幸运。 456

基于POI-TL实现动态Word模板数据填充(含图表):从需求到落地的完整开发实践

本文聚焦企业级报告生成场景中 “在线编辑模板 + 动态数据填充” 的核心需求,详细阐述基于 POI-TL、OnlyOffice 与 MinIO 的全栈实现方案。通过代码示例拆解模板加载、文字填充、图表匹配渲染(含通过关系 ID 关联图表与段落的关键逻辑)、报告存储全步骤。最终通过技术组合实现业务人员可视化编辑模板、后端高效填充数据的目标,为同类动态 Word 生成需求提供可复用的实践参考。

imHanweihu的博客 1866

【论文复现】——基于LM优化的NDT点云配准算法

传统的正态分布变换配准算法处理初始位姿变换相差较大的两帧点云时,存在无法收敛或者陷入局部最小值的问题。为了提高算法的收敛性能,提出了一种基于LM方法改进的三维正态分布变换配准算法。

点云侠的博客 1163

对泛型的理解

概述: 集合中是可以存放任意对象的,只要把对象丢进集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。 举例: public static void main ( String[] args ) { ArrayList list = new ArrayList(); list.add("abc"); list.add("itcast"); list.add(5);

Abstract_TOM的博客 415

基于Simulink的风电系统背靠背变流器解耦控制仿真

本文完成了基于 Simulink 的风电背靠背变流器解耦控制仿真,实现了:✅掌握 dq 解耦控制的数学本质✅构建 MSC + GSC 完整控制链✅验证其在动态、扰动下的卓越性能✅达成高解耦度、低 THD、稳母线三大目标。

xiaoheshang_123的博客 79

C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托

泛型集合和ArrayList的装箱拆箱、常见的泛型类型、泛型类和泛型方法、泛型约束、 泛型委托泛型很难理解?不然在接触的一个新的概念的时候,总会感觉难以理解,当你掌握并能熟练地使用的时候,发现这个概念其实简单的,我相信大多数码农都会有这种似曾相识的感觉。可能大多数人刚学习泛型的时候觉得很难理解,当然我也是这样的,所以便写下这篇文章加深一下对泛型的印象。

dotNet全栈开发 4万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

一篇带你玩转泛型,泛型详解,什么是泛型,泛型缓存,协变与逆变,泛型方法,为什么使用泛型,泛型接口,ASP.Net泛型,泛型Generic

泛型是C#2.0推出的新语法,不是语法糖,而是2.0由框架升级提供的功能。我们在编写代码时,经常会遇到功能非常相似的模块,只是他们处理的数据不一样(参数类),有没有一种方法用同一个方法来处理传入不同类型的参数呢?泛型就可以解决这个问题。List 就是泛型,带有""括号的都是泛型,List是一个集合,也有可能是一组 泛型集合。泛型的用处是用一个东西来满足不同类型的需求。泛型命名空间。

Sx_Oracle的博客 2349

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

c#泛型使用详解:泛型特点、泛型继承、泛型接口、泛型委托

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员的开发效率。更重要的是,C#的泛型比C++的模板使用更加安全,并且通过避免装箱和拆箱操作来达到性能提升的目的。因此,我们很有必要掌握并善用这个强大的语言特性。 C#泛型特点: 1、如果实例

zdhlwt2008的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java泛型详解:Java泛型集合、泛型类、泛型方法、泛型的使用

在 Java 1.5 之前没有泛型,通常需要使用强制类型转换的方式将一种数据类型转换为另一种数据类型,这种转换要求开发者对实际参数的类型具有可预知性。对于强制类型转换错误的情况,编译器可能不会提示错误,但是在运行时会出现异常,这是一个安全隐患。 为了解决这一隐患,从 Java 1.5 开始提供了泛型。泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。本节将详...

jijiangpeng的博客 7446

c#: 泛型接口、泛型方法

泛型可以自定义泛型接口、泛型类、泛型方法、泛型事件、泛型委托。 1>自定义泛型接口 和普通接口一样,一个泛型接口通常也是与某些对象相关的约定规程。泛型接口的声明如下: interface  [接口名] { [接口体] } 在c#中,通过尖括号“。一般来说,声明泛型接口与声明非泛型接口遵循相同的规则。 泛型接口定义完成之后,就要定义此接口的子类。定义泛型接口的子类有以下两种方法。

匆匆那年 1万+

Java泛型的其他应用——泛型接口、泛型方法、泛型数组以及泛型的嵌套设置

学习目标 掌握泛型接口的使用 掌握泛型方法的定义的及使用 掌握泛型数组的使用 掌握泛型的嵌套设置 之前所有的操作都是在类中直接使用泛型操作的,那么,对于Java来说,也可以直接在接口中定义及使用泛型。 定义泛型接口 在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型类的语法类似,也是在接口名称后面加上,如下格式所示: [访问权限]

1万+

Java泛型——为何要有泛型

对于String类类型来说,它是继承自Object的,而Integer的直接父类是Number,因此会有Integer无法转String的错误。泛型类是在实例化类的时候指明泛型的具体类型,那么泛型方法就是在调用方法时指明泛型的具体类型。在实现传入泛型实参的泛型接口的实现类定义中,实现类即使不声明泛型,也不会编译错误。在实现未传入泛型实参的泛型接口的实现类定义中,实现类要声明泛型,否则会编译错误。为了避免这样可能的错误,引入泛型,使编译器在编译阶段就提示不匹配的类类型。方法返回了一个更加特定的返回类型。

xiaovie的博客 1734

java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法

Java代码Java代码Java代码Java代码Java代码Java代码Java代码。

2401_84619530的博客 1542

java泛型——泛型类、泛型方法、泛型接口

泛型Java 泛型Java 泛型是什么泛型类泛型类的格式泛型类举例泛型方法泛型方法的格式泛型方法举例泛型接口泛型接口的格式泛型接口举例 Java 泛型 Java 泛型是什么 官方定义: 泛型是Java SE 1.5的新特性,泛型的本质就是参数化类型,也就是说所操作的数据类型被指定为一个参数 这种参数类型可以用在类、接口和方法的创建中,分别成为泛型类、泛型接口、泛型方法 优缺点: ​ 优点:可以不用再类型转换了 ​ 缺点:降低了代码的可读性 泛型类 泛型类:当一个类要操作的引用数据类型不确定的时候,可

一个小小的码农 6600

Java之泛型,什么是泛型?为什么用泛型?(泛型详解)

1.为什么会有泛型呢? 早期的Object类型可以接受任意的对象类型,但是在实际使用中,会有类型转化的问题,存在隐患,所以Java提供泛型解决这个安全问题 2.什么是泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类...

围巢 4001

泛型、泛型擦除、泛型通配符

1、泛型定义        将对象的类型作为参数,指定到其他类或方法上,从而保证类型转换的安全性和稳定性,这就是泛型。泛型的本质是参数化类型,也就是把所操作的数据类型指定一个参数,使代码可以用于多种类型。        泛型是JDK1.5的新特性,Java语言...

xingze的博客 1845

C#入门级——泛型、泛型类、泛型接口、泛型方法和泛型委托

C#入门级——泛型、泛型类、泛型接口、泛型方法和泛型委托

dlwlrma_516的博客 5053

Java泛型——类泛型、接口泛型、方法泛型的实现及泛型限定与类型变化关系

自定义泛型类、泛型方法、泛型接口 对泛型的限定、以及数据类型的变化:协变、逆变、双变、不变

任天柳 5200
上一篇: AIDL使用步骤
下一篇: webview的postURL以及webview中SessionID同步
Android_Study_OK
博客等级 码龄11年 91粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值