彻底弄懂Java的泛型1 - 泛型类

news2024/11/29 4:42:49

Java泛型是初级程序员向中高级程序员进阶的必经之路,他不是特别难,但是想全部搞懂和会用,还是不容易的。

本文从实战角度出发,讲解你在公司做开发,可能会用到泛型的一种场景。

泛型T的用法

引子

先来看一个简单的类:

/**
 * 专门打印整数的类
 */
@Data
public class IntegerPrinter {
    //这是需要打印的东西
    private Integer whatToPrint;

    public void print(){
        System.out.println(whatToPrint);
    }
}

这个类的作用就算打印一个整数。 使用起来是这样的:

public static void main(String[] args) {
    IntegerPrinter printer = new IntegerPrinter();
    printer.setWhatToPrint(10);
    printer.print();
}

打印出来就算10

那如果我要打印Double类型的数据呢?

是不是得新建一个类:

/**
 * 专门打印双精度数字的类
 */
@Data
public class DoublePrinter {
    //这是需要打印的东西
    private Double whatToPrint;

    public void print(){
        System.out.println(whatToPrint);
    }
}

测试:

public static void main(String[] args) {
    DoublePrinter printer = new DoublePrinter();
    printer.setWhatToPrint(10.0);
    printer.print();
}

其他的呢,什么Cat打印类啊,Dog打印类啊,需求一多,xxxPrinter就越多,这样做肯定是不合适的。

泛型类

为了解决上面的问题,Java给我们提供了泛型类,所谓的泛型类,就算说有个变量的类型我不确定,所以先用一个符号占个位子,后面使用的时候你再临时决定到底用什么类型?

上面的例子,虽然我们写了两个class,但是逻辑是完全类似的,区别就是printer变量的类型问题。

改成

/**
 * 专门任何东西的类
 */
@Data
public class WhatEverPrinter<T> {
    //这是需要打印的东西
    private T whatToPrint;

    public void print(){
        System.out.println(whatToPrint);
    }
}

这个T就是泛型,当然,它不一定叫T,可以是任何字母或者单词(关键字除外)。这个叫做泛型类,注意,是加在类名后面的!

使用的时候就是这样

public static void main(String[] args) {
    WhatEverPrinter<Double> printer = new WhatEverPrinter<>();
    printer.setWhatToPrint(10.0);
    printer.print();
}

是不是很熟悉,对了,我们创建List的时候,不就是经常用这个玩意吗?

你肯定写过类似这样的代码吧:

List<String> names = new ArrayList<>();

为什么可以这样?

点进List的源码

这个E就相当于我们的T,代表泛型。

好的,本文主要介绍了泛型类的用法,你学会了吗?

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

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

相关文章

UDP 协议

目录 一、什么是协议 二、认识UDP 协议 2.2 UDP 协议的报文格式 2.3 使用UDP 协议传输大文件时的策略 2.4 UDP协议的工作流程 一、什么是协议 为了使数据在网络上传输&#xff08;从源头到达目的&#xff09;&#xff0c;网络通信的参与方必须遵循相同的规则&#xff0c;如…

SpaceX的星舰爆炸了:产品开发,快速失败真的很重要

目录 前言 快速失败 产品生命周期 专栏上线 前言 看到很多人都在聊星舰&#xff0c;今天就来简单谈谈“炸星舰”带给我们的启示。 在美国中部时间20日&#xff0c;SpaceX公司的“星舰”超重型火箭进行了首次轨道飞行。 但在该火箭成功点火升空几分钟后&#xff0c;却在半…

Java-synchronized实现详解(从Java到汇编)

synchronized作为java语言中的并发关键词&#xff0c;其在代码中出现的频率相当高频&#xff0c;大多数开发者在涉及到并发场景时&#xff0c;一般都会下意识得选取synchronized。 synchronized在代码中主要有三类用法&#xff0c;根据其用法不同&#xff0c;所获取的锁对象也…

如何通过开源项目搭建私有云平台--第四步下:安装rancher 监控

第四步下&#xff1a;安装rancher 监控,缺告警 本来想监控与告警一起写&#xff0c;但最近几天研究了rancher的告警&#xff0c;按照文档说法&#xff0c;配置了但没有触发&#xff0c;网上找了一些资料&#xff0c;有的在rancer 2.6成功的&#xff0c;但我用同样的方法在2.7.…

09 【Sass语法介绍-函数指令】

1.前言 在之前的章节我们学习过 Sass 提供的各种各样的函数&#xff0c;那么如果我们需要自定定义函数来使用就需要用到函数指令 function了。本节内容我们来学习 Sass 函数指令的语法和使用&#xff0c;在 Sass 中自定义函数是必须要掌握的&#xff01; 2.什么是 Sass 函数指…

又一款可视化神器,开源了!

在互联网数据大爆炸的这几年&#xff0c;各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的 BI 工具。 借助这些 BI 工具&#xff0c;我们能够大幅提升数据分析效率、生成更高质量的项目报告&#xff0c;让用户通过直观的数据看到结果&#xff0c;减低沟通成…

安卓项目如何做单元测试

前言 先说一下创建篇文章的目的&#xff0c;近期负责搭建公司的单元测试框架&#xff0c;于是查阅了网上的很多文章&#xff0c;以及参考了github上很多的项目例子&#xff0c;并且也进行了相当多的尝试。这其中花费了很多的精力&#xff0c;大约有两三周的时间&#xff0c;远…

淘系抓包流程(淘宝数据无法抓包解决方式)

淘系抓包流程 结合frida和adb工具以及mumu模拟器进行抓包。 具体的关系图: frida的安装 frida安装&#xff0c;直接安装官网的脚手架。frida官网使用python的pip安装&#xff0c;python > 3。 安装后使用查看版本命令来确认是否安装。 pip install frida-tools frida --ve…

【严重】VMware Aria Operations for Logs v8.10.2 存在反序列化漏洞(CVE-2023-20864)

漏洞描述 VMware Aria Operations for Logs前身是vRealize Log Insight&#xff0c;VMware用于处理和管理大规模的日志数据产品。 VMware Aria Operations for Logs 8.10.2版本中存在反序列化漏洞&#xff0c;具有 VMware Aria Operations for Logs 网络访问权限的未经身份验…

“SCSA-T学习导图+”系列:交换技术之STP

本期引言&#xff1a; 在通信工程当中&#xff0c;从物理层面上&#xff0c;我们可以采用冗余链路保证网络的健壮性。冗余是指出于系统安全和可靠性等方面的考虑&#xff0c;人为地对一些关键部件或功能进行重复的配置。当系统发生故障时&#xff0c;比如某一设备发生损坏&…

【Linux】Linux下的gbd调试,你学废了吗

操作系统核心数centos 3.10.032位单核 gbd调试方法-以线程运行时调试为例 线程死锁状态时查看栈升级gbd通过gdb在程序运行时进行调试 线程死锁状态时查看栈 在线程-线程安全之互斥中&#xff0c;我们自己写了一个模拟实现的线程死锁情况 我们用gbd调试查看了当前线程的调用&a…

拉链表制作

1.拉链表的应用场景 拉链表适合于&#xff1a;数据会发生变化&#xff0c;但是大部分是不变化的&#xff08;即&#xff1a;缓慢变化维。还需要保留历史数据做分析的场景&#xff09; 2.拉链表的形成过程 关键的过程 第四步&#xff1a;获取变化的数据&#xff08;创建和修改…

Flask连接MySQL

本文章涉及到Flask框架和HTML内容&#xff0c;相关知识可查看链接 HTML-form表单和提交_html form 提交_小梁今天敲代码了吗的博客-CSDN博客https://blog.csdn.net/weixin_43780415/article/details/130110722 前端引入和html标签_小梁今天敲代码了吗的博客-CSDN博客https://b…

vscode下drawio无法使用

问题描述&#xff1a; Vscode下&#xff0c; 刚下载drawio这个插件&#xff0c;在vscode左边EXPLORER下&#xff0c;没有Test这个页面,导致vscode无法使用drawio。 解决办法&#xff1a; 在自己需要的目录下&#xff0c;新建一个文件&#xff0c;例如test,并命名为test.drawi…

数据结构算法

直接插入排序 1.从第一个元素开始&#xff0c;该元素可以认为已经被排序 2.取下一个元素tem&#xff0c;从已排序的元素序列从后往前扫描 3.如果该元素大于tem&#xff0c;则将该元素移到下一位 4.重复步骤3&#xff0c;直到找到已排序元素中小于等于tem的元素 5.tem插入到该元…

5.1劳动节,致敬最可爱的人!Cocos社区杰出贡献者出炉

Cocos 引擎的生态建设与繁荣&#xff0c;离不开社区开发者的辛勤付出。 2022.5 ~ 2023.5 年度期间&#xff0c;有这样一批 Cocos 社区开发者&#xff0c;他们使用 Cocos Creaor 引擎创作内容与产品、分享技术和经验&#xff0c;为 Cocos 社区默默贡献自己的一份力量&#xff0c…

改进YOLOv8:替换轻量化骨干网络Efficient V1、Efficient V2《重新思考卷积神经网络的模型缩放》)

这里写目录标题 1 EfficientNetV1中存在的问题2.EfficientNetV2网络框架3.YOLOv8添加Efficient V1代码yaml文件Efficient V1代码运行4. 添加Efficient V2代码yaml文件Efficient V2运行Efficient V1论文地址:https://arxiv.org/pdf/1905.11946.pdf Efficient V1代码地址:

Golang每日一练(leetDay0049) 二叉树专题(9)

目录 144. 二叉树的前序遍历 Binary-tree Preorder Traversal &#x1f31f; 145. 二叉树的前序遍历 Binary-tree Postorder Traversal &#x1f31f; 对比&#xff1a; 94. 二叉树的中序遍历 Binary-tree Inorder Traversal &#x1f31f; 146. LRU缓存 LRU Cache &am…

调用移动云OCR识别身份证

一.开通移动云OCR服务 在下面这个网址开通免费服务&#xff0c;&#xff0c;每个账号可免费使用500次&#xff0c;先要实名认证。 通用文字识别 (10086.cn)https://ecloud.10086.cn/home/product-introduction/Generalverify 有两种方式&#xff1a; 这里选择第二种 。 二…

炸裂的 Auto-GPT,帮我自动生成小视频!

大家好&#xff0c;我是程序员贺同学。 继前段时间爆火的 ChatGPT 后&#xff0c;又一个炸裂的开源项目 Auto-GPT 出现了。 仿佛一夜之间&#xff0c;AI 圈又出现了一个新晋顶流。我们来看看它有多&#x1f525;。 在 GitHub 上&#xff0c;仅最近不到两个礼拜&#xff0c;这个…