java泛型的高级用法

Java 泛型提供了强大的泛型机制,可以在编译时检查类型安全,并且可以编写通用的代码,使得代码更加灵活和重用。除了基本的泛型用法外,还有一些高级的泛型用法,以下是一些常见的高级泛型用法:

  1. 泛型通配符(Wildcard):通配符用于表示未知类型,可以增加泛型的灵活性。主要包括上界通配符 <? extends T> 和下界通配符 <? super T>。通配符可以用在泛型类、方法、接口等地方。

  2. 泛型方法:泛型方法是在方法声明时定义泛型类型,而不是在类定义时。可以让方法根据调用时的参数类型来确定返回类型,增加方法的灵活性。

  3. 泛型接口:类似于泛型类,泛型接口可以定义一种通用类型,可以在接口的方法中使用泛型类型。

  4. 泛型类的继承:泛型类也可以进行继承,子类可以继承父类的泛型类型,并可以添加自己的泛型类型。

  5. 泛型限定和约束:可以使用 extendssuper 关键字来限定泛型的范围,用于实现更灵活的泛型类型限定和约束。

  6. 泛型擦除与反射:在运行时,Java 的泛型信息会被擦除,这就导致了泛型类型不能通过反射获取泛型信息。但是可以通过获取父类(ParameterizedType)来获取泛型信息。
    当使用泛型时,虽然在运行时泛型信息会被擦除,但是可以通过获取父类(ParameterizedType)来获取泛型信息。以下是一个示例代码演示如何通过获取父类来获取泛型信息:

可以通过使用匿名类来实现。以下是一个示例代码:


package org.example.gstjava.pojo;import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;/*** 一个泛型类的示例,包含两个泛型参数 T 和 U。*/
class GenericClass<T,U> {}public class Main {/*** 主函数:演示如何通过反射获取匿名泛型类的泛型参数类型。* @param args 命令行参数(未使用)*/public static void main(String[] args) {// 创建一个匿名泛型类实例,继承自 GenericClass<String,Integer>GenericClass<String,Integer> generic = new GenericClass<String,Integer>() {};// 获取匿名类的泛型超类类型Type genericSuperclass = generic.getClass().getGenericSuperclass();// 检查获取的类型是否为参数化类型if (genericSuperclass instanceof ParameterizedType) {// 将泛型超类类型转为 ParameterizedType 接口实例,以便访问其参数ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;// 获取实际的泛型参数类型数组Type[] typeArguments = parameterizedType.getActualTypeArguments();// 遍历并打印所有泛型参数的类型名称if (typeArguments.length > 0) {for(Type type:typeArguments){System.out.println("Type: " + type.getTypeName());}} else {// 如果没有泛型参数,打印相应信息System.out.println("Type: No type arguments");}} else {// 如果获取的类型不是参数化类型,打印相应信息System.out.println("Type: Not a parameterized type.");}}
}

在示例中,我们使用了匿名类 new GenericClass<String>() {} 来创建 GenericClass 的实例,这样我们就可以通过 getClass().getGenericSuperclass() 获取到超类的 ParameterizedType。这样可以确保 typeArguments.length 大于0,从而使 if (typeArguments.length > 0) 这个条件成立。希望这个示例能够满足您的要求。如果有任何问题,请随时告诉我。

  1. 泛型数组:在 Java 中创建泛型数组是不合法的,但是可以使用通配符或 Array.newInstance() 方法来创建泛型数组。

  2. 泛型类型推断:在 Java 7 中引入了钻石操作符<>,可以省略泛型类型的声明,编译器会根据上下文自动推断泛型类型。

这些是一些常见的高级泛型用法,通过灵活运用泛型机制,可以使代码更加通用和安全。在实际开发中,合理利用泛型能够提高代码的质量和扩展性。
以下是针对上述8个高级泛型用法的示

例代码:

  1. 泛型通配符(Wildcard)
public void printList(List<?> list) {for (Object element : list) {System.out.println(element);}
}
  1. 泛型方法
public <T> T add(T a, T b) {return a + b; //这里仅作举例,实际上加法不适用于泛型,应该改用其他方式
}
  1. 泛型接口
interface MyInterface<T> {void doSomething(T item);
}
  1. 泛型类的继承
class GenericClass<T> {T value;
}class SubClass<T> extends GenericClass<T> {// 子类可以继承父类的泛型类型
}
  1. 泛型限定和约束
public <T extends Number> void processNumber(T number) {// 只能传入 Number 及其子类
}
  1. 泛型擦除与反射
class MyClass<T> {private Class<T> type;public MyClass(Class<T> type) {this.type = type;} 
}MyClass<String> myObject = new MyClass<>(String.class);
  1. 泛型数组
List<?>[] arrayOfLists = new List<?>[2];
arrayOfLists[0] = new ArrayList<>();
arrayOfLists[1] = new LinkedList<>();
  1. 泛型类型推断
List<String> list = new ArrayList<>(); // 使用了钻石操作符
import java.util.*;public class Main {public static void main(String[] args) {// 泛型通配符示例List<String> stringList = new ArrayList<>();stringList.add("Hello");stringList.add("World");printList(stringList);// 泛型方法示例Integer sum = add(10, 20);System.out.println("Sum: " + sum);// 泛型接口示例MyInterface<String> myInterface = new MyImplementation<>();myInterface.doSomething("Generic Interface");// 泛型类的继承示例SubClass<Integer> subClass = new SubClass<>();subClass.value = 100;System.out.println("Value: " + subClass.value);// 泛型限定和约束示例processNumber(10);// 泛型擦除与反射示例MyClass<String> myObject = new MyClass<>(String.class);System.out.println("Type: " + myObject.type.getName());// 泛型数组示例List<?>[] arrayOfLists = new List<?>[2];arrayOfLists[0] = new ArrayList<>();arrayOfLists[1] = new LinkedList<>();System.out.println("Array Size: " + arrayOfLists.length);// 泛型类型推断示例List<String> list = new ArrayList<>();list.add("Java Generics");System.out.println("List: " + list.get(0));}public static void printList(List<?> list) {for (Object element : list) {System.out.println(element);}}public static <T> T add(T a, T b) {return a; // 这里仅作举例}interface MyInterface<T> {void doSomething(T item);}static class MyImplementation<T> implements MyInterface<T> {@Overridepublic void doSomething(T item) {System.out.println("Doing something with: " + item);}}static class GenericClass<T> {T value;}static class SubClass<T> extends GenericClass<T> {// 子类可以继承父类的泛型类型}public static <T extends Number> void processNumber(T number) {System.out.println("Number is: " + number);}static class MyClass<T> {private Class<T> type;public MyClass(Class<T> type) {this.type = type;}}
}

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

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

相关文章

【YOLO v5 v7 v8 v9小目标改进】AFPN 渐进式特征金字塔网络:解决多尺度特征融合中,信息在传递过程丢失

AFPN 渐进式特征金字塔网络&#xff1a;解决多尺度特征融合中&#xff0c;信息在传递过程丢失 提出背景AFPN 多尺度特征金字塔 非邻近层次的直接特征融合 自适应空间融合操作 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 提出背景 论文&#xff1a;https:…

人力资源管理软件大比拼:这篇文章帮你做出明智选择!

本期为您盘点的助力现代企业强力提效的人力资源管理软件有&#xff1a;Zoho People&#xff0c;Workday&#xff0c;BambooHR和Namely。 Zoho People人力资源管理软件 Zoho People是一款全面的云端人力资源管理&#xff08;HRM&#xff09;软件&#xff0c;由Zoho Corporation…

Android开发快速上手,2024年展望Android原生开发的现状

前言 很多次小伙伴问到学习方法&#xff0c;我也很想写这样的一篇文章来跟大家讨论下关于学习方法这件事情。 其实学习方法这个事情&#xff0c;我没啥发言权&#xff0c;因为我自己本身都是没啥方法可言的&#xff0c;就瞎折腾那种&#xff0c;但是大家想看这样的一篇文章&a…

TinyEMU编译与使用

TinyEMU编译与使用 1 介绍2 准备工作3 编译TinyEMU3.1 安装依赖库3.2 编译 4 运行TinyEMU4.1 在线运行4.2 离线运行 5 共享目录5.1 修改root_9p-riscv64.cfg5.2 启动TinyEMU5.3 执行挂载命令 6 TinyEMU命令帮助 1 介绍 原名为riscvemu&#xff0c;于2018-09-23&#xff0c;改为…

mapbox鼠标滑到气泡中不关闭气泡。

贴个群号 WebGIS学习交流群461555818&#xff0c;欢迎大家 效果图 像官网这样的例子&#xff0c;我们并不能鼠标移动到上面的popup内容中&#xff0c;但是有时候是有这样的需求的&#xff0c;比如复制里面的值&#xff0c;或者里面加个按钮&#xff0c;可以点击出现弹窗&…

Vue3:使用setup实现组合式开发

一、情景说明 首先&#xff0c;我们应该知道&#xff0c;Vue3中&#xff0c;可以用Vue2的语法&#xff0c;进行配置式开发。 在这里&#xff0c;我们用Vue3的新语法&#xff0c;实现组合式开发 二、案例 1、组件中使用setup代替Vue2中的data、methods等vc配置项 关键配置&a…

declare 模块声明

示例代码&#xff1a; declare module *.css; declare module *.less; declare module *.png;这些代码行是 TypeScript 的模块声明&#xff0c;用于告诉 TypeScript 编译器如何处理某些类型的模块导入。TypeScript 是一种基于 JavaScript 的静态类型检查语言&#xff0c;它允许…

STM32(19)I2C模块 主机发数据

发送数据&#xff1a; 等待空闲&#xff1a; 发送起始位&#xff1a; 发送地址&#xff1a; 发送数据&#xff1a;

鸿蒙中Text组件的展开和收起效果

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 效果&#xff1a; 原理分析&#xff1a; 通过效果图我们知道&#xff0c;可以将‘...展开’ 盖在文本内容的的右下角来实现这个效果。那么要实现盖上的效果可以通过层叠布局&#xff08;Stack&#xff09;来实现&am…

基于ceph-deploy部署Ceph 集群

Ceph分布式存储一、存储基础1、单机存储设备1.1 单机存储的问题 2、分布式存储(软件定义的存储SDS)2.1 分布式存储的类型 二、Ceph简介1、Ceph优势2、Ceph架构3、Ceph 核心组件4、OSD 存储后端5、Ceph 数据的存储过程6、Ceph 版本发行生命周期 三、Ceph 集群部署1、 基于 ceph-…

【Vue3】Ref 和 ShallowRef 的区别

目录 什么是 Ref什么是 ShallowRef区别对比示例代码 什么是 Ref Ref 是 Vue 3 中的一个新的基本响应式数据类型&#xff0c;它允许我们包装任意的 JavaScript 值&#xff0c;并且在数据变化时发出通知。Ref 提供了一个 .value 属性来访问其内部的值&#xff0c;同时还提供了一…

【前端捉鬼记】记录两个js中非常基础的小白问题

写逻辑时&#xff0c;遇到两个js代码里非常基础的小白问题&#xff0c;用简单的代码测试并记录一下&#xff1a; 1、一个对象 a 有个数组类型的属性 b&#xff0c;将这个数组取出保存到另一个变量 m&#xff0c;修改 m&#xff0c;对象 a 中的属性 b 是否跟随变化&#xff1f;…

【Java EE初阶二十七】深入了解cookie

1. 简单了解cookie Cookie是http请求里header 中的一个属性&#xff0c;浏览器持久化存储数据的一种机制&#xff0c;网页无法访问主机的文件系统&#xff0c;要想存储数据就得通过其他的方式&#xff1b; 且cookie中保存的数据也是键值对的形式&#xff0c;最终还是要把这个键…

移动开发:网格视图

一、在新建GridView模块下添加图片以及创建cell.xml文件 1.粘贴图片时选择红框中的路径&#xff0c;点击“OK” 2.在路径后添加-mdpi后缀,再点击“OK” 二、相关代码块 1.MainActivity.java文件代码 package com.example.gridview;import androidx.appcompat.app.AppCompatAc…

供应链优化:降本增效的核心战略——张驰咨询

在当今这个高度竞争的商业环境中&#xff0c;企业为了保持竞争力&#xff0c;不断寻求降低成本和提升效率的策略变得至关重要。有效的成本控制和效率提升不仅能够增加企业的利润率&#xff0c;还能增强其市场地位和客户满意度。以下是一些实用的策略&#xff0c;旨在帮助企业实…

HCIE之MPLS练习(六)

MPLS练习 一、静态LSP1、IGP构建FEC2、全网运行MPLS3、打通LSP通道3.1、静态LSP配置3.2、转发过程3.3、验证标签转发过程 4、利用LSP传递任意流量4.1、配置4.2、验证 二、LDP协议1、IGP构建FEC2、全网运行mpls、ldp3、mpls ldp邻居关系、LIB表4、转发过程5、验证mpls转发过程6、…

从嵌入式Linux到嵌入式Android

最近开始投入Android的怀抱。说来惭愧&#xff0c;08年就听说这东西&#xff0c;当时也有同事投入去看&#xff0c;因为恶心Java&#xff0c;始终对这玩意无感&#xff0c;没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业&#xff0c;所以只能回过头又来学。 首先还是…

leetcode——异或运算—— 只出现一次的数字

给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff…

Python(NetOps)前传-网络设备开局配置

背景 我们知道用Python在cli配置网络设备的前提是&#xff1a; 网络设备与Python主机网络可达网络设备已开启并完成ssh相关配置 目标 本文已华为S5720S-52P-LI-AC交换机为例&#xff0c;完成&#xff1a; 完成网络设备开局配置&#xff1b;用Python脚本验证ssh登录 配置 …

深入理解nginx负载均衡round-robin算法

目录 1. 概述2. 如何启用round-robin算法3. 初始化round-robin算法3.1 设置算法上下文环境初始化回调函数3.2 加载服务器列表4. 初始化负载均衡请求上下文5. 获取peer6. 释放peer1. 概述 nginx为我们提供了强大的HTTP代理功能,而负载均衡算法是实现后端多Real Server代理的一个…