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

news2024/11/15 21:34:32

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.coloradmin.cn/o/1143466.html

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

相关文章

YUV空间-两张图片颜色匹配(颜色替换)

在做颜色匹配时&#xff0c;从RGB转换到YUV也有一些优势。因为YUV把亮度和色彩分开了&#xff0c;所以可以更容易地调整图像的亮度分布和色彩平衡⁴。而且&#xff0c;YUV也更接近人类感知颜色的方式&#xff0c;所以可以更好地保持图像的自然感。 这个公式是用来做颜色匹配的&…

Node.js 的适用场景

目录 ​编辑 前言 适用场景 1. 实时应用 用法 代码 理解 2. API 服务器 用法 代码示例 理解 3. 微服务架构 用法 代码示例 理解 总结 前言 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它使得 JavaScript 可以脱离浏览器运行在服务器…

如何公网远程访问本地WebSocket服务端

本地websocket服务端暴露至公网访问【cpolar内网穿透】 文章目录 本地websocket服务端暴露至公网访问【cpolar内网穿透】1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功…

javaweb+mysql的电子书查阅和下载系统

图书分类查看、热门下载、最新上传、站内数据统计。 登陆注册、图书查询、图书详情、图书下载。 身份分为管理员和用户。 源码下载地址 支持&#xff1a;远程部署/安装/调试、讲解、二次开发/修改/定制

【JavaSE】注释\标识符\关键字\字面常量\数据类型与变量

下面直接介绍Java的基础知识点&#xff0c;很多与C语言相似&#xff0c;但是也有很多不一样的点 目录 一、注释 二、标识符与关键字 1.标识符 2.关键字 三、字面常量 四、数据类型与变量 1.数据类型 2.变量 3.不同类型的变量 4.类型转换与类型提升 5.字符串类型 一…

[减脂期食谱] 自制千岛酱

[减脂期食谱] 自制千岛酱 成品如下&#xff1a; 最中间的那个&#xff0c;算比较居中的颜色吧&#xff0c;其实自己家做原版的千岛酱还是比较简单的&#xff0c;它的底就是蛋黄酱(蛋黄油乳化的酱)&#xff0c;随后里面的材料比较自由&#xff0c;维基百科是这么介绍的&#xf…

『C++成长记』C++入门—— 函数重载引用

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、函数重载 &#x1f4d2;1.1函数重载的概念 &#x1f4d2;1.2函数重载的种类 …

【密评】商用密码应用安全性评估从业人员考核题库(十五)

商用密码应用安全性评估从业人员考核题库&#xff08;十五&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 3501 单项选择题 根据GM/T 0115 《信息系统密码应用测评要求》&am…

基于人机环境系统的新全局工作空间理论

&#xff08;旧的&#xff09;全局工作空间理论是由心理学家伯纳德巴尔斯&#xff08;Bernard Baars&#xff09;提出的一种关于意识的理论。该理论认为&#xff0c;意识是一种全局性的心理状态&#xff0c;其中包含了我们当前的感知、思维和意识内容。根据全局工作空间理论&am…

【Python从入门到进阶】40、requests的基本使用

接上篇《39、使用Selenium自动验证滑块登录》 上一篇我们介绍了使用selenium进行滑块自动验证操作。本篇我们结束selenium的章节&#xff0c;来学习requests库的基本使用。 一、requests与urllib的爱恨情仇 1、requests与urllib的区别 大家在前面的学习中&#xff0c;访问网…

2.23每日一题(反常积分收敛性的判断)

解法一&#xff1a;用定义&#xff08;当被积函数的原函数比较好找时&#xff09;&#xff1a; 积分结果为存在则收敛&#xff0c;不存在则发散。 解法二&#xff1a;通过p积分的比较法判断敛散性&#xff1a; 即被积函数与p积分相比较&#xff0c;使得两者同敛散&#xff1b;再…

轻量封装WebGPU渲染系统示例<3>-纹理立方体(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/ImgTexturedCube.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5…

算法通过村第十七关-贪心|黄金笔记|跳跃游戏

文章目录 前言跳跃游戏最短跳跃游戏总结 前言 提示&#xff1a;曾走过山&#xff0c;走过水&#xff0c;其实只是借助他们走过我的生命&#xff1b;我看着天&#xff0c;看着地&#xff0c;其实只是借助它们确定我的位置&#xff1b;我爱这她&#xff0c;爱着你&#xff0c;其实…

【Java】基于微服务架构的智慧工地监管云平台源码带APP

前言&#xff1a;智慧工地监管平台是一种利用物联网、云计算、大数据等技术手段实现工地信息化管理的解决方案。它通过数据采集、分析和应用&#xff0c;在实时监控、风险预警、资源调度等方面为工地管理者提供了全方位的支持&#xff0c;提高了工地管理的效率和质量。智慧监管…

数据结构OJ题

目录 1.字符串左旋 2.字符串旋转结果 3.旋转数组 4.移除元素 本篇主要是讲解一些OJ题目。 1.字符串左旋 字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 方法1【暴力求解】 翻转1…

Mybatis @MapKey注解返回指定Map源码解析与用例

文章目录 前言技术积累什么是MyBatisMapKey注解 用例展示MapKey注解源码解析写在最后 前言 最近在开发的一个业务功能需要从一批数据中根据业务字段提取数据&#xff0c;对于这个需求可能有的同学就直接用for或者stream循环的方式进行处理了。但是&#xff0c;作为一个资深的搬…

了解模拟电路设计(入门级)

模拟电路是电路设计中一个重要的部分&#xff0c;它是指用来对模拟信号进行传输&#xff0c;变换&#xff0c;处理&#xff0c;放大&#xff0c;测量和显示等等工作的电路。而模拟信号是指连续变化的电信号&#xff08;数字信号是离散的电信号&#xff09;。 常见的模拟电路主要…

前端Vue页面中如何展示本地图片

<el-table :data"tableData" stripe style"width: 100%"><el-table-column prop"imgUrl" label"图片"><template v-slot"scope"><img :src "http://localhost:8888/image/ scope.row.imgUrl&qu…

【ROS入门】雷达、摄像头及kinect信息仿真以及显示

文章结构 雷达信息仿真以及显示Gazebo仿真雷达配置雷达传感器信息xacro文件集成启动仿真环境 Rviz显示雷达数据 摄像头信息仿真以及显示Gazebo仿真摄像头新建xacro文件&#xff0c;配置摄像头传感器信息xacro文件集成启动仿真环境 Rviz显示摄像头数据 kinect信息仿真以及显示Ga…

支持CT、MR三维后处理的医学PACS源码

医学影像归档与通信系统&#xff08;picture archiving and communication systems&#xff0c;PACS&#xff09;是应用于医院的数字医疗设备&#xff0c;如CT、MR&#xff08;磁共振&#xff09;、US&#xff08;超声成像&#xff09;、X线、DSA&#xff08;数字减影&#xff…