127. Java 泛型 - 泛型类与子类型

文章目录

  • 127. Java 泛型 - 泛型类与子类型
    • 1. 泛型类和接口的子类型化
      • 示例:`ArrayList` 和 `List`
    • 2. 自定义泛型接口的子类型化
      • 示例:泛型接口的子类型
      • 解释
    • 3. 泛型类和接口的类型参数
    • 4. 总结

127. Java 泛型 - 泛型类与子类型

1. 泛型类和接口的子类型化

在 Java 中,可以通过扩展或实现泛型类或接口来对其进行子类型化。这意味着,如果一个类或接口是泛型的,它的类型参数将影响该类或接口的子类型关系。这个关系通过 extendsimplements 子句来决定。

示例:ArrayListList

考虑 Java 的 Collections 类库,ArrayList<E> 实现了 List<E>,而 List<E> 又扩展了 Collection<E>。因此,ArrayList<String>List<String> 的子类型,而 List<String> 又是 Collection<String> 的子类型。这是泛型类之间子类型关系的一种体现。

List<String> list = new ArrayList<>();  // OK, ArrayList<String> 是 List<String> 的子类型

这就表明,当不改变类型参数时,泛型类之间会保持子类型关系。ArrayList<String>List<String> 的子类型,而 List<String> 又是 Collection<String> 的子类型。

2. 自定义泛型接口的子类型化

假设我们需要定义一个自定义的泛型接口 PayloadList,它将泛型类型 P 的值与每个元素相关联。例如,这个接口可能声明如下:

interface PayloadList<E, P> extends List<E> {void setPayload(int index, P val);// 其他方法
}

在这个接口中,E 代表列表元素的类型,P 代表与每个元素相关联的“有效负载”类型。

示例:泛型接口的子类型

接下来,我们可以创建 PayloadList 的具体类型参数化版本:

PayloadList<String, String> stringPayloadList = new SomePayloadListImpl<>();
PayloadList<String, Integer> integerPayloadList = new SomePayloadListImpl<>();
PayloadList<String, Exception> exceptionPayloadList = new SomePayloadListImpl<>();
  • PayloadList<String, String>List<String> 的子类型。
  • PayloadList<String, Integer>List<String> 的子类型,尽管它使用了不同的泛型类型参数。
  • PayloadList<String, Exception> 也是 List<String> 的子类型,尽管它的第二个类型参数是 Exception

解释

这里的核心概念是:只要不改变类型参数之间的相对关系,泛型类型之间就能保留子类型关系。即使我们在泛型接口 PayloadList 中使用不同的类型参数,它们依然可以和 List<String> 保持子类型关系。关键是,类型参数 E 的一致性确保了我们可以将 PayloadList<E, P> 类型的对象赋值给 List<E> 类型的变量。

3. 泛型类和接口的类型参数

泛型类和接口的类型参数与它们的子类型关系密切相关。类型参数不仅决定了接口或类的功能,还影响了它们的继承关系和泛型约束。例如,不能将 PayloadList<String, String> 直接赋值给 PayloadList<Integer, Integer>,即使这两个类型都继承自 List<String>,因为它们的第二个类型参数不同。

PayloadList<String, String> list1 = new SomePayloadListImpl<>();
PayloadList<Integer, Integer> list2 = new SomePayloadListImpl<>();// 这将会报错,因为 list1 和 list2 不是相同类型,即使它们都继承自 List<String>。
list1 = list2;  // 编译错误,类型参数不同

4. 总结

  • 泛型类和接口的子类型化:泛型类或接口的子类型关系由类型参数确定。只要不改变类型参数之间的关系,子类型关系就能保留。例如,ArrayList<String>List<String> 的子类型,而 List<String> 又是 Collection<String> 的子类型。
  • 自定义泛型接口:我们可以定义自己的泛型接口,如 PayloadList,并通过不同的类型参数创建不同的子类型。这些子类型之间仍然保持继承关系。
  • 类型参数的关系:泛型类或接口的类型参数决定了它们的继承关系和可赋值性。类型参数不匹配的泛型类型不能互相赋值。

通过理解这一点,学员可以更好地理解泛型类和接口之间的继承关系,以及如何自定义泛型接口和确保类型安全。

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

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

相关文章

内网服务器怎么设置公网远程访问? windows桌面连接和Linux自带SSH外网异地跨网用完整步骤教程

没有公网IP的本地主机跨网访问是经常需要用到的网络场景。要设置内网服务器在公网进行异地远程访问&#xff0c;需依次完成确保网络连接正常、配置防火墙、启用远程访问服务、和利用类似nat123内网映射外网打通等一系列步骤&#xff0c;以保障不同内网的远程访问的顺利进行。一…

数据提取之bs4(BeautifuSoup4)模块与Css选择器

BeautifuSoup4from bs4 import BeautifulSoup创建对象 <class bs4.BeautifulSoup>soup BeautifulSoup(源码, 解析器)bs4标签种类&#xff08;1&#xff09;tag: 标签print(soup.title, type(soup.title))&#xff08;2&#xff09;获取标签里面的文本内容, 可导航的字符…

CPP中的List

一.list的介绍&#xff1a;1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。2.list的底层是双向链表结构&#xff0c;带有哨兵位的头结点 。3. list与forward_list非常相似&#xff1a;最主要的不同在于forward_list是单…

Ntfs!LfsUpdateLfcbFromRestart函数分析之Ntfs!LfsFindOldestClientLsn

第0部分&#xff1a;//// Find the oldest client Lsn. Use the last flushed Lsn as a starting point.//Lfcb->OldestLsn Lfcb->LastFlushedLsn;LfsFindOldestClientLsn( RestartArea,Add2Ptr( RestartArea, Lfcb->ClientArrayOffset, PLFS_CLIENT_RECORD ),&…

「日拱一码」021 机器学习——特征工程

目录 特征选择 过滤法&#xff08;Filter Methods&#xff09; 方差选择法 相关系数法 卡方检验 包裹法&#xff08;Wrapper Methods&#xff09; 递归特征消除&#xff08;RFE&#xff09; 嵌入法&#xff08;Embedded Methods&#xff09; L1正则化&#xff08;Lasso…

k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper

ChartMuseum 是 Kubernetes 生态中用于存储、管理和发布 Helm Charts 的开源系统&#xff0c;主要用于扩展 Helm 包管理器的功能 核心功能 ‌集中存储‌&#xff1a;提供中央化仓库存储Charts&#xff0c;支持版本管理和权限控制。 ‌ ‌跨集群部署‌&#xff1a;支持多集群环境…

C++编程学习(第二天)

1、求a和b两个数之和。#include <iostream> using namespace std;int main() {int a, b, sum; //定义变量a、b、sumcout << "请输入第一个数字a: "; //打印需要显示的字符串cin >> a; // >&…

毫米波雷达守护银发安全:七彩喜跌倒检测仪重构居家养老防线

在老龄化加速与独居老人数量攀升的背景下&#xff0c;跌倒已成为威胁老年人生命安全的“隐形杀手”。七彩喜跌倒检测仪以毫米波雷达技术为核心&#xff0c;通过“非接触式监测智能预警”重塑居家安全防护体系&#xff0c;为银发群体构建起全天候、无感化的数字守护网。技术突破…

面试复盘:节流中第二次触发的事件?答错补课

面试复盘&#xff1a;节流中第二次触发的事件&#xff1f;答错补课 背景描述 今天面试时被问到一个看似基础但暗藏玄机的问题&#xff1a;“节流&#xff08;Throttle&#xff09;函数中&#xff0c;第二次触发的那一帧事件是否会被丢掉&#xff1f;” 我基于对经典节流实现的…

Spark伪分布式集群搭建(Ubuntu系统)

环境准备 系统要求&#xff1a;Ubuntu 20.04/22.04 LTS 软件版本&#xff1a; Hadoop 3.3.5 JDK 8 Spark-3.5.6-bin-hadoop3 硬件要求&#xff1a;至少4GB内存&#xff0c;20GB磁盘空间 以下是基于Ubuntu系统的Spark伪分布式集群搭建全流程。以Spark 3.5.6 Hadoop 3.3.…

【快手】数据挖掘面试题0001:查找连续三天登录的用户

文章大纲一、测试数据构建二、自连接方案三、窗口函数方案一张用户表&#xff0c;uer_id&#xff0c;signin_date&#xff0c;大概是这么几项&#xff0c;查找连续三天登录的用户。 比如说&#xff0c;1,2两天登录不是连续三天&#xff0c;456登录为连续三天登录&#xff0c;56…

简说scp命令

简单介绍 scp的全称是&#xff1a;Secure Copy Protocol&#xff08;安全复制协议&#xff09;&#xff0c;是Linux中用于在网络中安全传输文件的命令行工具。它基于SSH协议&#xff0c;用于在本地服务器和远程服务器之间&#xff0c;或者两台远程服务器之间复制文件或目录。 s…

自动化测试解决方案Parasoft SOAtest无脚本UI测试实践指南

传统UI自动化测试常面临技术门槛高、维护成本大、稳定性差等挑战。尤其在页面频繁变更时&#xff0c;测试脚本的更新和维护会显著降低测试效率。 自动化测试解决方案Parasoft SOAtest通过可视化操作和智能元素定位技术&#xff0c;无需编写代码&#xff0c;让测试人员能够像真…

vscode配置头文件和编译器

在 VS Code 中配置编译器和头文件路径需要修改两个核心文件&#xff1a;c_cpp_properties.json&#xff08;用于智能提示&#xff09;和 tasks.json&#xff08;用于构建&#xff09;。以下是详细步骤&#xff1a; —### 1. 配置智能提示和头文件路径 (c_cpp_properties.json)作…

HTML+JS+CSS制作一个数独游戏

闲来无事&#xff0c;用HTMLJSCSS制作了一个数独游戏消遣。其实主要是自己做题的时候用笔画删除数字太容易出错&#xff0c;所以想搞一个程序稍微辅助一下。通过制作这个程序&#xff0c;反而提高了手工做题的水平&#xff0c;至少学会了记录步数以便于回退。 20250710功能更新…

嵌入式硬件中电容的基本原理与实现详解02

我们今天重点讨论点知识点如下: 1.各种种类的电容优缺点对比讲解 2.电容的标称值介绍 3.电容的单位介绍 4.常见的电压信号有哪些? 5. 电容的耐压值讲解 6.电容的容值有哪些? 7.12pF、15pF 电容常用在什么场合? 8. 振荡电路中使用的电容常常需要使用什么材质的电容? 9.100n…

Python训练打卡DAY46

DAY46&#xff1a;通道注意力&#xff08;SE注意力&#xff09; 恩师浙大疏锦行 知识点&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通…

fastadmin_php专项

1.时间的判断,还有就是在php这边如何去拿前端html元素上面的值input($row.borrowtime);// 创建两个 DateTime 对象$row_expecttime new \DateTime(input($row.borrowtime));$par_expecttime new \DateTime( $params[expecttime]); // // 计算两个日期之间的差异 // …

如何在MySQL中选择使用InnoDB还是MyISAM引擎?

在 MySQL 中选择 InnoDB 还是 MyISAM 存储引擎时&#xff0c;需根据应用场景的需求权衡功能、性能和数据完整性。以下是具体的选择指南&#xff1a; 1. 优先考虑事务和外键需求必须使用 InnoDB&#xff1a; 若应用需要 事务支持&#xff08;如金融转账、订单处理&#xff09;或…

邀请函 | 知从科技邀您共赴2025 RISC-V 中国峰会

第五届RISC-V中国峰会将于2025年7月16至19日在上海张江科学会堂隆重举办&#xff0c;本届峰会由上海开放处理器产业创新中心&#xff08;SOPIC&#xff09;主办&#xff0c;RISC-V国际开源实验室&#xff08;RIOS实验室&#xff09;和上海张江高科技园区开发股份有限公司联合主…