Java 枚举类型与泛型-第13章

Java 枚举类型与泛型-第13章

1.枚举类型

枚举类型是一种特殊的数据类型,用于表示一组有限的命名常量。枚举类型可以帮助您更清晰地定义和管理相关常量,并提供类型安全性。

1.1使用枚举类型设置常量

枚举类型是一种非常方便的方式来设置常量。我们可以创建一个枚举类型,其中包含需要的常量,然后在代码中使用这些常量。以下是如何使用枚举类型来设置常量的示例:

public class ConstantsExample {// 定义一个枚举类型来表示颜色常量enum Color {RED, GREEN, BLUE}public static void main(String[] args) {// 使用枚举常量Color myColor = Color.BLUE;System.out.println("我的颜色是:" + myColor);// 使用switch语句根据不同的颜色执行不同的操作switch (myColor) {case RED:System.out.println("我喜欢红色!");break;case GREEN:System.out.println("绿色也不错!");break;case BLUE:System.out.println("蓝色是我的最爱!");break;default:System.out.println("我不确定我的颜色是什么。");}}
}

在上述示例中,我们首先定义了一个名为Color的枚举类型,其中包含了三个颜色常量:REDGREENBLUE。然后,我们在main方法中使用枚举常量Color.BLUE来表示颜色,以及使用switch语句根据不同的颜色执行不同的操作。

枚举类型使得代码更具可读性和可维护性,因为它将相关的常量组织在一起,并提供了一种类型安全的方式来处理它们。这在需要使用常量的情况下非常有用,因为它可以减少错误和提高代码的清晰度。

1.2深入了解枚举类型

1.枚举类型的常用方法

枚举类型在Java中有一些常用的方法,这些方法使得操作和管理枚举常量更加方便。以下是一些常用的枚举类型方法:

  1. values(): 这个方法返回枚举类型的常量数组,允许您遍历所有的枚举常量。例如:Season.values()将返回包含所有季节的Season[]数组。
  2. valueOf(String name): 这个方法返回与给定名称匹配的枚举常量。通常用于将字符串转换为枚举常量。例如:Season.valueOf("SUMMER")将返回Season.SUMMER
  3. name(): 这个方法返回枚举常量的名称作为字符串。例如:Season.SUMMER.name()将返回字符串 “SUMMER”。
  4. ordinal(): 这个方法返回枚举常量在枚举类型中的位置(从0开始)。例如:Season.SUMMER.ordinal()将返回2,因为它是Season枚举中的第三个常量。

这些方法可以帮助我们在处理枚举类型时执行各种操作,如遍历常量、根据名称查找常量或获取常量的位置。以下是一个示例:

public class EnumMethodsExample {enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}public static void main(String[] args) {// 使用values方法遍历所有常量Day[] days = Day.values();for (Day day : days) {System.out.println("Day: " + day.name() + ", Ordinal: " + day.ordinal());}// 使用valueOf方法根据名称查找常量Day tuesday = Day.valueOf("TUESDAY");System.out.println("Tuesday is " + tuesday);// 使用name方法获取常量的名称String fridayName = Day.FRIDAY.name();System.out.println("Friday's name is " + fridayName);}
}

上示例演示了如何使用这些常用的枚举方法来操作枚举常量。这些方法使得在处理枚举类型时更加便捷和有用。

2.枚举类型中的构造方法

枚举类型可以具有自定义构造方法,但这些构造方法在使用时有一些限制和特殊的用法。通常情况下,枚举类型的构造方法应该是私有的,以确保只有枚举常量内部可以调用它们。

以下是一个示例,演示如何在枚举类型中定义和使用构造方法:

enum Color {RED(255, 0, 0), // 枚举常量,每个常量都可以传入参数GREEN(0, 255, 0),BLUE(0, 0, 255);// 枚举类型的构造方法private int red;private int green;private int blue;private Color(int red, int green, int blue) {this.red = red;this.green = green;this.blue = blue;}public int getRed() {return red;}public int getGreen() {return green;}public int getBlue() {return blue;}
}public class EnumConstructorExample {public static void main(String[] args) {Color myColor = Color.RED;System.out.println("My color is " + myColor);System.out.println("Red: " + myColor.getRed() + ", Green: " + myColor.getGreen() + ", Blue: " + myColor.getBlue());}
}

在上述示例中,我们定义了一个名为Color的枚举类型,其中包含了三个颜色常量:REDGREENBLUE。每个常量都有一个构造方法,用于初始化redgreenblue成员变量。这些构造方法是私有的,只能在枚举内部访问。我们还定义了getter方法来获取颜色的RGB值。

当我们使用枚举常量时,可以看到它们的构造方法被调用,并且可以使用getter方法来获取颜色的RGB值。这样,枚举类型允许您将自定义数据与每个枚举常量相关联。

需要注意,枚举类型的构造方法在定义时是私有的,并且只能在枚举内部使用。这是因为枚举常量通常在定义时就被实例化,所以不允许外部代码创建新的枚举常量。

2.泛型

回顾向上转型与向下转型
在这里插入图片描述

泛型是一种Java编程语言的特性,它允许您编写通用的、类型安全的代码,以便在不同的数据类型上工作。泛型允许您在编写类、接口和方法时使用类型参数,这样您可以编写一次代码,然后在多种数据类型上重复使用,而不必为每种数据类型都编写新的代码。

2.1定义泛型类

要定义一个泛型类,我们需要在类名后面添加类型参数,并在类的内部使用这个类型参数来代表泛型类型。以下是一个简单的泛型类的示例:

public class MyGenericClass<T> {private T data;public MyGenericClass(T data) {this.data = data;}public T getData() {return data;}
}

在上述示例中,MyGenericClass 是一个泛型类,它具有一个类型参数 <T>,该参数代表一个泛型类型。构造方法 MyGenericClass(T data) 接受一个泛型类型的参数,并将其存储在私有成员变量 data 中。getData 方法返回存储在 data 中的泛型数据。

还可以在创建泛型类的实例时指定具体的数据类型。例如:

MyGenericClass<Integer> integerGeneric = new MyGenericClass<>(42);
int intValue = integerGeneric.getData();
System.out.println("Integer Value: " + intValue);MyGenericClass<String> stringGeneric = new MyGenericClass<>("Hello, Generics!");
String stringValue = stringGeneric.getData();
System.out.println("String Value: " + stringValue);

在上述示例中,我们创建了两个 MyGenericClass 的实例,一个使用整数类型 (Integer),另一个使用字符串类型 (String) 作为泛型类型。这允许我们在不同的数据类型上使用相同的泛型类,提高了代码的重用性和类型安全性。

2.2泛型的常规用法

泛型在Java中有许多常规用法,它们有助于提高代码的可读性、类型安全性和重用性。以下是一些常见的泛型用法:

  1. 集合类使用泛型:Java标准库中的集合类如ArrayListHashMap等都使用泛型来存储元素,以确保集合中的元素是一种特定类型。这提供了类型安全性,避免了在编译时和运行时出现不合适的数据类型。

    List<String> stringList = new ArrayList<>();
    Map<Integer, String> intToStringMap = new HashMap<>();
    
  2. 自定义数据结构:您可以创建自定义的泛型数据结构,以便处理不同类型的数据。

    public class Pair<T, U> {private T first;private U second;public Pair(T first, U second) {this.first = first;this.second = second;}public T getFirst() {return first;}public U getSecond() {return second;}
    }
    
  3. 泛型方法:您可以创建泛型方法,以便在方法内部使用类型参数。

    public <T> T findMax(T[] array) {T max = array[0];for (T element : array) {if (element.compareTo(max) > 0) {max = element;}}return max;
    }
    
  4. 通配符和限定通配符:通配符允许您编写灵活的代码,接受不确定的泛型类型,而限定通配符允许您指定通配符类型的范围。

    public void printList(List<?> list) {for (Object element : list) {System.out.print(element + " ");}
    }public double sumOfNumbers(List<? extends Number> numbers) {double sum = 0;for (Number number : numbers) {sum += number.doubleValue();}return sum;
    }
    
  5. 泛型接口:您可以创建泛型接口,定义接口中的方法,这些方法可以在不同的实现中使用不同的泛型类型。

    interface ListConverter<T> {List<T> convertToList(T[] array);
    }
    

2.3泛型的高级用法

泛型在Java中有许多高级用法,允许更高度的抽象和灵活性。以下是一些常见的高级泛型用法:

  1. 泛型通配符的上下界:通过使用通配符 ? 可以创建更灵活的泛型方法和类。通配符可以指定上限和下限,以便更精确地控制参数的类型。

    • 上限通配符 <? extends T>:表示通配符的类型必须是 T 类型或其子类型。
    • 下限通配符 <? super T>:表示通配符的类型必须是 T 类型或其父类型。
    public double sumOfNumbers(List<? extends Number> numbers) {double sum = 0;for (Number number : numbers) {sum += number.doubleValue();}return sum;
    }public void addIntegers(List<? super Integer> list, int[] integers) {for (int num : integers) {list.add(num);}
    }
    
  2. 泛型通配符捕获:有时需要捕获通配符的类型以在方法内部使用。这可以通过将通配符类型存储在一个变量中来实现。

    public static <T> void copy(List<? extends T> source, List<T> destination) {for (T item : source) {destination.add(item);}
    }
    
  3. 泛型擦除和反射:在Java中,泛型信息在运行时被擦除,这会导致一些限制。但是,您可以使用反射来获取泛型类型信息。

    Class<?> clazz = myGenericInstance.getClass();
    Type type = clazz.getGenericSuperclass();
    if (type instanceof ParameterizedType) {ParameterizedType paramType = (ParameterizedType) type;Type[] typeArgs = paramType.getActualTypeArguments();Class<?> genericType = (Class<?>) typeArgs[0];System.out.println("Generic type: " + genericType.getName());
    }
    
  4. 泛型方法的类型推断:从Java 7开始,编译器可以推断泛型方法的类型参数,无需显式指定。

    public static <T> T getFirst(List<T> list) {return list.get(0);
    }List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
    Integer first = getFirst(integers); // 编译器可以推断类型参数
    
  5. 泛型枚举:从Java 5开始,可以将泛型用于枚举,使得每个枚举常量可以有不同的类型参数。

    enum Result<T> {SUCCESS, FAILURE;private T value;public T getValue() {return value;}public void setValue(T value) {this.value = value;}
    }
    

5. **泛型枚举**:从Java 5开始,可以将泛型用于枚举,使得每个枚举常量可以有不同的类型参数。

enum Result {
SUCCESS, FAILURE;

   private T value;public T getValue() {return value;}public void setValue(T value) {this.value = value;}

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

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

相关文章

基于51单片机的温度测量报警系统的设计与制作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、实习目的二、实习任务2.1 设计温度测量报警系统硬件电路2.2 温度测量报警系统软件编程、仿真与调试&#xff1b;2.3 完成温度测量报警系统的实物制作与调试…

从一线到联合,克唑替尼在ALK阳性NSCLC治疗新旅程【医游记】

&#xff08;图片来源于网络&#xff09; 一、克唑替尼简介 克唑替尼(Crizotinib),商品名赛可瑞,是一款口服服用的小分子酪氨酸激酶抑制剂。克唑替尼最早于2011年被美国FDA批准用于ALK阳性晚期NSCLC的治疗。其主要靶点为间变淋巴瘤激酶(ALK)和ROS1(ROS proto-oncogene 1)融合…

3.1、Linux的vim编辑器

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 前言&#xff1a; 插入模式 底行模式 命令模式 前言&#xff1a; 没有进行配置的vim编辑器在写代码时和记事本没什么两样&#xff0c;所以最开始我们可以先下载一个插件&#xff0c;在Linux下两行指令的问题&…

视频格式高效转换:MP4视频批量转MKV格式的方法

随着数字媒体技术的不断发展&#xff0c;视频格式转换已经成为了我们日常工作中不可或缺的一部分。不同的视频格式适用于不同的场景和设备&#xff0c;因此将视频从一种格式转换为另一种格式往往是我们必须完成的任务。在本文中&#xff0c;我们将重点介绍如何运用云炫AI智剪高…

Apollo安装全攻略

安装方式 概述快速安装安装基础软件安装 Ubuntu Linux安装 Docker Engine 安装 Apollo 环境管理工具获取 GPU 支持&#xff08;可选&#xff09;创建和进入 Apollo 环境容器 源码安装安装 Linux 系统&#xff08;可选&#xff09;安装 NVIDIA GPU 驱动安装 docker下载并编译 Ap…

【Linux】安装配置解决CentosMobaXterm的使用及Linux常用命令命令模式

目录 一、介绍 1. 背景 2. 讲述&功能 二、Centos安装配置&MobaXterm 1. 创建 2. 安装 3. 配置 4. MobaXterm使用 三、Linux常用命令&模式 1. 常用命令 2. 三种模式 3. 命令使用&换源 4. 拍照备份 一、介绍 1. 背景 CentOS的背景可以追溯到200…

STM32F4X SDIO(二) SDIO协议

上一节简单介绍了SD卡的分类&#xff0c;本节将会介绍SD卡的通信协议&#xff0c;也就是SDIO协议。 STM32F4X SDIO&#xff08;二&#xff09;SDIO协议 SD 卡管脚和寄存器SD卡管脚分布SD卡通信协议SD卡寄存器SD卡内部结构 SDIO总线SDIO总线拓扑SDIO总线协议SDIO协议的基本结构…

java将list转为逗号隔开字符串,将逗号连接的字符串转成字符数组,​将逗号分隔的字符串转换为List​(Java逗号分隔-字符串与数组相互转换)

一、通过testList.stream().collect(Collectors.joining(",")) &#xff0c;通过流转换&#xff0c;将list转为逗号隔开字符串 List<String> testList new ArrayList<>(); testList.add("test1"); testList.add("test2"); testList…

ArcGIS笔记12_ArcGIS搜索工具没法用?ArcGIS运行很慢很卡?

本文目录 前言Step 1 ArcGIS搜索工具没法用Step 2 ArcGIS运行很慢很卡 前言 这是笔者最近遇到的两个小问题&#xff0c;新换了台式机&#xff0c;安装上ArcGIS后发现搜索工具没法用&#xff0c;而且感觉还不如原来笔记本运行的流畅&#xff0c;加载图层很慢&#xff0c;编辑要…

web - 前段三剑客

目录 前言 一. HTML 常用标签演示 图片标签 ​编辑 表格标签(重点) ​编辑 表单标签 (重点) 布局标签 其余标签 二. CSS 2.1 . css的三种引入方式 2.2 . 三大选择器 2.3 . css样式 - 浮动 2.4 . css样式 - 定位 1.static 2.absolute(绝对位置) 3.relavite(相…

【PythonRS】Pyrsgis库安装+基础函数使用教程

pyrsgis库是一个用于处理地理信息系统(GIS)数据的Python库。它提供了一组功能强大的工具&#xff0c;可以帮助开发人员使用Python语言创建、处理、分析和可视化GIS数据。通过使用pyrsgis库&#xff0c;开发人员可以更轻松地理解和利用地理信息。 pyrsgis库包含了许多常见的GIS操…

自学SLAM(5)《第三讲:李群和李代数》作业

前言 小编研究生的研究方向是视觉SLAM&#xff0c;目前在自学&#xff0c;本篇文章为初学高翔老师课的第三次作业。 文章目录 前言1.群的性质2.验证向量叉乘的李代数性质3.推导 SE(3) 的指数映射4.伴随5.轨迹的描绘6.* 轨迹的误差(附加题) 1.群的性质 课上我们讲解了什么是群。…

UML中类之间的六种主要关系

UML中类之间的六种主要关系: 继承&#xff08;泛化&#xff09;&#xff08;Inheritance、Generalization&#xff09;, 实现&#xff08;Realization&#xff09;&#xff0c;关联&#xff08;Association)&#xff0c;聚合&#xff08;Aggregation&#xff09;&#xff0c;组…

Linux--进程替换

1.什么是进程替换 在fork函数之后&#xff0c;父子进程各自执行代码的一部分&#xff0c;但是如果子进程想要执行一份全新的程序呢&#xff1f; 通过进程替换来完成&#xff0c;进程替换就是父子进程代码发生写时拷贝&#xff0c;子进程执行自己的功能。 程序替换就是通过特定的…

python 笔记:h5py 读取HDF5文件

1 HDF5文件 HDF5 是 Hierarchical Data Format version 5 的缩写&#xff0c;是一种用于存储和管理大量数据的文件格式一个h5py文件可以看作是 “dataset” 和 “group” 二合一的容器 dataset : 数据集&#xff0c;像 numpy 数组一样工作group : 包含了其它 dataset 和 其它 …

GZ035 5G组网与运维赛题第4套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第4套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

C语言_断言assert详解

一、assert定义 assert() 的用法像是一种"契约式编程"&#xff0c;在我的理解中&#xff0c;其表达的意思就是&#xff0c;程序在我的假设条件下&#xff0c;能够正常良好的运作&#xff0c;其实就相当于一个 if 语句&#xff1a; if(假设成立) {程序正常运行&…

(免费领源码) Asp.Net#SQL Server校园在线投票系统10557-计算机毕业设计项目选题推荐

摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。由于现在网络的发达&#xff0c;校园投票通过网…

java - IDEA IDE - 设置字符串断点

文章目录 java - IDEA IDE - 设置字符串断点概述笔记END java - IDEA IDE - 设置字符串断点 概述 IDE环境为IDEA2022.3 在看一段序列化的代码, 想找出报错抛异常那个点, 理解一下代码实现. 因为序列化代码实现在第三方jar包中, 改不了(只读的). 根本数不清第几次才会开始报…

OpenCV学习(五)——图像基本操作(访问图像像素值、图像属性、感兴趣区域ROI和图像边框)

图像基本操作 5. 图像基本操作5.1 访问像素值并修改5.2 访问图像属性5.2 图像感兴趣区域ROI5.3 拆分和合并图像通道5.4 为图像设置边框&#xff08;填充&#xff09; 5. 图像基本操作 访问像素值并修改访问图像属性设置感兴趣区域&#xff08;ROI&#xff09;分割和合并图像 …