学习笔记070——Java中【泛型】和【枚举】
文章目录
- 1、泛型
- 1.1、为什么要使用泛型?
- 1.2、泛型的应用
- 1.3、泛型通配符
- 1.4、泛型上限和下限
- 1.5、泛型接口
- 2、枚举
1、泛型
Generics 是指在定义类的时候不指定类中某个信息(属性/方法返回值)的具体数据类型,而是用一个标识符来替代,当外部实例化对象的时候再来指定具体的数据类型。
集合和数组相比较,优势在于长度可以随时改变,集合中存储的数据类型是灵活的,不固定。
1.1、为什么要使用泛型?
使用泛型可以确保集合中数据的统一性,同时它又兼具很好的灵活性
package com.htl.test;import java.util.ArrayList;public class Test3 {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList();list.add(1);list.add(2);for (int i = 0; i < list.size(); i++) {int num = list.get(i);System.out.println(num);}}
}
1.2、泛型的应用
在自定义类中添加泛型,基本语法
public class 类名<泛型标识1,泛型标识2...>{private 泛型标识1 id;public 泛型标识2 test(){return (泛型标识2) new Object();}
}
自定义一个表示时间的类 Time
package com.htl.test;public class Time<T> {private T value;public T getValue() {return value;}public void setValue(T value) {this.value = value;}
}
package com.htl.test;public class Test4 {public static void main(String[] args) {Time<Integer> time1 = new Time<>();time1.setValue(10);System.out.println("现在的时间是" + time1.getValue());Time<String> time2 = new Time<>();time2.setValue("十点");System.out.println("现在的时间是" + time2.getValue());}
}
package com.htl.test;public class Test5 {public static void main(String[] args) {Time2<String,Integer,Float> time = new Time2<>();time.setHour("十点");time.setMinute(10);time.setSeconde(10.0f);System.out.println("现在的时间是" + time.getHour() + ":" + time.getMinute() + ":" + time.getSeconde());}
}
package com.htl.test;public class Time2<H,M,S> {private H hour;private M minute;private S seconde;public H getHour() {return hour;}public void setHour(H hour) {this.hour = hour;}public M getMinute() {return minute;}public void setMinute(M minute) {this.minute = minute;}public S getSeconde() {return seconde;}public void setSeconde(S seconde) {this.seconde = seconde;}
}
静态成员不能用泛型来修饰,非静态成员变量可以用泛型。
静态成员变量在类加载的时候就存入到内存中了,没有类型,所以无法存入,就不能定义为静态的。
静态方法可以使用泛型
private static Object hour;
public static<H> H getHour() {return (H)hour;
}
1.3、泛型通配符
String 和 Integer 在泛型引用中不能转换为 Object,多态在泛型引用中不生效
package com.htl.test2;import java.util.ArrayList;public class Test {public static void main(String[] args) {ArrayList<String> list1 = new ArrayList<>();test(list1);ArrayList<Integer> list2 = new ArrayList<>();test(list2);}/*** 既可以传入String类型的集合* 也可以传入Integer类型的集合*/public static void test(ArrayList<?> list){}}
1.4、泛型上限和下限
使用泛型的时候可以通过泛型上限和下限对数据类型的范围进行扩充
泛型上限
表示实例化时的具体数据类型,可以是上限类型的子类或者上限类型本身,用 extends 关键字来修饰。
泛型下限
表示实例化时的具体数据类型,可以是下限类型的父类或者下限类型本身,用 super 关键字来修饰。
基本语法:
泛型上限:类名<泛型标识符 extends 上限类名>
泛型下限:类名<泛型标识符 super 下限类名>
package com.htl.test2;public class Time<T> {public static void main(String[] args) {test(new Time<Number>());test(new Time<Byte>());test(new Time<Integer>());test2(new Time<String>());test2(new Time<Object>());}/*** 参数的泛型只能是Number或者它的子类,Number、Byte、short、Integer...*/public static void test(Time<? extends Number> time){}/*** 参数的泛型只能是String或者它的父类,String和Object*/public static void test2(Time<? super String> time){}
}
1.5、泛型接口
我们在定义类的时候可以使用泛型,定义接口的时候同样可以使用泛型。
public interface MyInterface<T>{public T getValue();
}
实现泛型接口有两种方式,一种是实现类在定义时继续使用泛型标识,另一种时实现类在定义时直接给出具体的数据类型。
1、实现类继续使用泛型
package com.htl.test3;public class MyImplement<T> implements MyInterface<T> {private T obj;public T getObj() {return obj;}public void setObj(T obj) {this.obj = obj;}@Overridepublic T getValue() {return null;}
}
2、实现类给出具体的数据类型
package com.htl.test3;public class MyImplement2 implements MyInterface<String> {private String obj;public String getObj() {return obj;}public void setObj(String obj) {this.obj = obj;}@Overridepublic String getValue() {return null;}
}
实现类继续使用泛型,在具体实例化的时候需要给出具体的数据类型。
实现类给出具体的数据类型,在具体实例化的时候不需要给出具体的数据类型。
package com.htl.test3;public class Test {public static void main(String[] args) {MyImplement<String> myInterface = new MyImplement<>();MyImplement2 myInterface1 = new MyImplement2();}
}
2、枚举
Enum 是一种有确定取值区间的数据类型,本质上就是一个类,简洁、安全、方便。
枚举的值被约束到一个特定的范围,只能从这个范围内取值。
package com.htl.test3;public enum WeekEnum {MONDAY,TUESDAY,WEDENSDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
package com.htl.test3;public enum ResponseEnum {SUCCESS(0,"成功"),ERROR(-1,"失败");private Integer code;private String msg;public Integer getCode() {return code;}public String getMsg() {return msg;}ResponseEnum(Integer code, String msg) {this.code = code;this.msg = msg;}
}
package com.htl.test3;public class Test2 {public static void main(String[] args) {System.out.println(ResponseEnum.SUCCESS.getCode());System.out.println(ResponseEnum.ERROR.getMsg());}
}
相关文章:
学习笔记070——Java中【泛型】和【枚举】
文章目录 1、泛型1.1、为什么要使用泛型?1.2、泛型的应用1.3、泛型通配符1.4、泛型上限和下限1.5、泛型接口 2、枚举 1、泛型 Generics 是指在定义类的时候不指定类中某个信息(属性/方法返回值)的具体数据类型,而是用一个标识符来…...

【工具变量】碳排放市场交易数据(2013-2023年)
一、时间范围:2013年8月5日到2023年1月13日 二、具体指标: 交易日期 城市名称 交易品种 开盘价 最高价 最低价 成交均价 收盘价 前收盘价 涨跌幅 总成交量 总成交额 …...

【视频生成模型】——Hunyuan-video 论文及代码讲解和实操
🔮混元文生视频官网 | 🌟Github代码仓库 | 🎬 Demo 体验 | 📝技术报告 | 😍Hugging Face 文章目录 论文详解基础介绍数据预处理 (Data Pre-processing)数据过滤 (Data Filtering)数据标注 (Data…...

基线检查:Windows安全基线.【手动 || 自动】
基线定义 基线通常指配置和管理系统的详细描述,或者说是最低的安全要求,它包括服务和应用程序设置、操作系统组件的配置、权限和权利分配、管理规则等。 基线检查内容 主要包括账号配置安全、口令配置安全、授权配置、日志配置、IP通信配置等方面内容&…...
uniapp跨端适配—条件编译
在uniapp中,跨端适配是通过条件编译实现的。条件编译允许开发者根据不同的平台(如iOS、Android、微信小程序、百度小程序等)编写不同的代码。这样可以确保每个平台上的应用都能得到最优的性能和用户体验。 以下是uniapp中条件编译的基本语法…...

【Java基础面试题013】Java中静态方法和实例方法的区别是是么?
回答重点 静态方法 使用static关键字修修饰的方法属于类随着类的加载而加载,随着类的卸载而消失可以通过类名直接调用,也可以通过对象调用,但是这种方式不推荐,会混淆意义,也不利于后期维护与扩展 class Example {st…...

C语言入门(一):A + B _ 基础输入输出
前言 本专栏记录C语言入门100例,这是第(一)例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…...
Vue日历组件FullCalendar使用方法
FullCalendar (全日历)Vue组件的使用 FullCalendar官方文档地址 FullCalendar日历组件支持Vue React Angular Javascript Vue2的框架示例: npm install --save fullcalendar/core fullcalendar/vue<template><div class"cal…...

TinyML在OBD-II边缘设备上燃油类型分类的实现与优化
论文标题:TinyML Implementation and Optimization for Fuel Type Classification on OBD-II Edge Device(TinyML在OBD-II边缘设备上燃油类型分类的实现与优化) 作者信息:Miguel Amaral, Morsinaldo Medeiros, Matheus Andrade, …...
vue3 中 defineProps 声明示例
1、直接声明 // 1、直接使用 defineProps(["tableData", "acceptType"]); 2、运行时声明方式不使用TypeScript类型注解,而是使用JavaScript对象,使用 type 来定义props // 2、运行时声明方式不使用TypeScript类型注解,…...
SpringBoot整合MybatisPlus报错Bean不存在:NoSuchBeanDefinitionException
报错信息: Exception in thread “main” org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.feng.mybatisplusdemo.dao.UserMapper’ available 解决办法: 将原来引入的MybatisPlus依赖:…...
异步电机的控制是否还有研究的必要,是不是已经非常成熟了?
随着工业现代化和自动化进程的加快,异步电机作为最为常见的电动机之一,广泛应用于各类机械设备和工业自动化系统中。异步电机因其结构简单、成本低廉、维护方便等优点而备受青睐。 异步电机的基本原理与应用 异步电机,又称感应电机…...
【Android】解决 ADB 中 SELinux 设置与 `Failed transaction (2147483646)` 错误
解决 ADB 中 SELinux 设置与 Failed transaction (2147483646) 错误 在使用 ADB 进行开发和调试时,经常会遇到由于 Android 系统安全策略(SELinux)引起的权限问题,尤其是在执行某些操作时,可能会遇到类似 cmd: Failur…...

企业车辆管理系统(源码+数据库+报告)
一、项目介绍 352.基于SpringBoot的企业车辆管理系统,系统包含两种角色:管理员、用户,系统分为前台和后台两大模块 二、项目技术 编程语言:Java 数据库:MySQL 项目管理工具:Maven 前端技术:Vue 后端技术&a…...

SAP RESTful架构和OData协议
一、RESTful架构 RESTful 架构(Representational State Transfer)是一种软件架构风格,专门用于构建基于网络的分布式系统,尤其是在 Web 服务中。它通过利用 HTTP 协议和一组简单的操作(如 GET、POST、PUT、DELETE&…...

centOS定时任务-cron服务
最近在训练模型的过程中,经常会因为内存爆炸而停止模型训练过程,而且因为内存占满停止的训练进程甚至都没有任何的报错提示。 1、需要减少num_worker的数量,降低需要占用内存的数据数量 2、可以通过free -h监控内存的占用情况 3、可以通过lin…...

Python毕业设计选题:基于django+vue的宠物服务管理系统
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 宠物商品管理 医疗服务管理 美容服务管理 系统…...
css常用属性有哪些
在上篇文章我们知道了利用css选择器来对HTML进行简单装饰,就像做word文档一样,需要对哪一段落修改格式,就需要先选中,css选择器就是这意思。这格式如何修改,怎么放大字体,怎么加粗,怎么修改背景…...

八大设计模式
设计模式在日常软件开发中的重要性 目录 单例模式工厂模式策略模式代理模式观察者模式装饰器模式模板方法模式建造者模式总结 单例模式 单例模式确保一个类只有一个实例,通常用于管理共享资源,如配置、缓存、线程池等。 代码实现:双重检查…...

神经网络基础-初识神经网络
人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的计算模型。人脑可以看做是一个生物神经网络,由众多的神经元连接而成。各个神经…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...