Java泛型的协变和逆变

2023-10-28

1.什么是泛型擦除

Java的泛型本质上不是真正的泛型,而是利用了类型擦除(type erasure)

2.协变(covariant)和逆变(contravariant)

2.1协变(covariant)

<? extends T>,?通配符,代表的是任何事物,?继承于T

现在有如下几个类:

Creature Animal Person Dog,其中Creature是Animal的父类,Animal是Person和Dog的父类

 这里报错的原因:型没有内建的协变类型,无法将List<Fruit>和ArrayList<Apple>关联起来,所以在编译的时候会报错

 这个时候我们把<? extends Animal>看成是一个整体,我们可以看出list的类型是Animal或Animal的父类(Creature)。但是我们不能确定list的类型是Animal的子类中的哪一个(Person or Dog),所以这就导致了使用<? extends T>出现的错误。

当然现在向上转型之后我们不能向list里面添加任何数据类型的对象,但是可以使用get方法获取里面的元素

2.2逆变(contravariant)

<? super T>,Animal是Dog,Person的超类,则这个时候对于JVM来说,它能确定list的类型的超类肯定是Dog,Person的父类

逆变则和协变相反

 总结:

协变是向上转型,只能get,不能add

逆变是向下转型,不能get,只能add------get元素的时候需要进行强制转换

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java泛型的协变和逆变 的相关文章

  • Log4j2 自动配置

    我在应用时遇到问题log4j2 xml自动配置正确 我认为这与我的文件夹排列有关 我在用着maven添加 log4j2 库并按如下方式安排我的项目 一个包含所有 通用 类的项目 供我的系统的服务器和客户端使用 另一个 核心 项目 服务器端应
  • 范围内的春季活动可能吗?

    Spring 事件机制支持发布应用程序事件并通过 Spring 组件监听这些事件 EventListener注解 但是 我在 中找不到有关在特定范围内发送事件的任何信息文档 https docs spring io spring docs
  • 这是重载,不同类中具有相同名称和不同签名的方法吗?

    如果我有以下 Java 代码 class A public int add int a int b return a b class B extends A public float add float a float b return a
  • Java 更改包名称大小写约定的原因

    就在你说这是重复的之前 我已经看到了其他问题 但我仍然想发布这个 所以我在读用 Java 思考 Bruce Eckel这段话是关于小写命名约定的 Java 1 0 和 Java 1 1 中的域扩展com edu org net等 按照惯例都
  • Java中如何存储profile?

    我仍在学习 Java 的诀窍 如果有一个明显的答案 我很抱歉 我有一个占用大量内存的程序 我想找到一种方法来减少其使用 但是在阅读了许多 SO 问题后 我认为在开始优化它之前我需要证明问题出在哪里 这就是我所做的 我在程序的开头添加了一个断
  • 为什么在 Java 7 中使用方法重载时,自动装箱不会推翻可变参数?

    我们的 Java 项目中有一个 LogManager 类 如下所示 public class LogManager public void log Level logLevel Object args do something public
  • Axis2 不返回自己的对象

    我编写了一些网络服务 其中一些返回一个简单的字符串 这个可以工作 另一些返回一个对象列表 不 axis2 1 5 1 无法处理集合类型 所以我将返回类型更改为Object 但我仍然收到这个异常 ERROR java lang Runtime
  • Java 同步计数器 - get() 怎么样?

    众所周知这么简单x 不是原子操作 实际上是读 增量 写操作 这就是为什么它应该同步 但是关于get 我读过它也应该同步 但有人能解释一下为什么吗 通过引入来避免内存一致性错误happens before关系 当出现以下情况时该怎么办get
  • 使用ThreadPoolExecutor,allowCoreThreadTimeOut和零核心线程有什么区别?

    阅读以下文档线程池执行器 https docs oracle com javase 7 docs api java util concurrent ThreadPoolExecutor html 我很困惑以下示例用法之间的区别 零个核心线程
  • java.util.Prefs 抛出 BackingStoreException - 为什么?

    我有一个系统可以缓存启动时 SOAP 调用的微小 简单结果 我需要实例能够在启动时重新加载其缓存 以防 SOAP 服务失效 并且还需要处理使用此缓存文件的多个实例的可能性 我选择使用java util prefs但是 Java 的内置自动同
  • JPanel 上的圆形边框

    我这里得到的是一个带有圆形边框的 JPanel 其设置如下 panel setBorder new LineBorder PanelColor 5 true 问题是 在每个角上都有 2 条从外角到内角的对角不透明线 即边框的长度 边界后面的
  • 使用 Spring Boot 应用程序属性设置 tomcat 属性

    我想为启动提供的 tomcat 设置 maxSwallowSize 属性 我的 application properties 有这一行 server context parameters maxSwallowSize 20971520 由于
  • 如何将报告导出为 PDF/A-1a、PDF/A-1b?

    在 jasper report 中生成 PDF A 包含许多陷阱 并且某些版本的 jasper report 不支持 这就是为什么我决定通过这个Question Answer 帖子 指示将带有图表的简单报告导出为 PDF A 所需的步骤和库
  • JAXB 将不需要的命名空间声明附加到标签

    我正在实现 XMPP 的自制子协议 并且使用 StAX 和 JAXB 的组合来解析 编组消息 当我整理一条消息时 我最终会得到大量不需要的命名空间声明
  • 如何用 JSON 表示数据库中的图像

    我需要基于数据库中的 blob 创建 JSON 为了获取 blob 图像 我使用下面的代码并在 json 数组中显示之后 Statement s connection createStatement ResultSet r s execut
  • 单击按钮后更改 JPanel

    我正在为我的应用程序构建简单的 GUI 我有几个 JPanel 我想根据单击 JButton 执行的操作来显示它们 如何禁用一个 JPanel 并启用另一个 JPanel 几个细节 我有一个 JFrame 课程 我正在其中构建启动 gui
  • 在 Back 上按遍历最后两个选项卡在 BottomNavigationView 中无法正常工作?

    单击后退按钮后 导航到上一个打开的选项卡 您只需遍历最后打开的两个选项卡即可退出应用程序 如何实现 我只想遍历我打开的所有选项卡 然后应用程序应该退出 这是布局
  • XStream:xstream 1.3.1 中具有属性和文本节点的节点?

    我想使用 XStream 将对象序列化为这种形式的 XML
  • 多个事件分派线程

    我是 Java Swing 新手 我的问题与事件队列和调度线程相关 我读到可以有多个事件队列 每个队列应用上下文 http www java2s com Open Source Java Document 6 0 JDK Modules s
  • 整个程序可以是不可变的吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我熟悉不可变性并且可以设计不可变类 但我主要拥有学术知识 缺乏实践经验 请参考上面的链接图片 尚不允许嵌入 从下往上看 学生需要新地址

随机推荐

  • jps命令

    列出目标系统上检测的 Java 虚拟机 JVM 此命令是实验性的 不受支持 概要 jps options hostid options 命令行选项 请参阅Options hostid 应为其生成进程报告的主机的标识符 它hostid可以包括
  • Android 6.0 CoordinatorLayout

    http www cnblogs com yuanchongjie p 4997134 html https www aswifter com 2015 11 12 mastering coordinator http blog csdn
  • 结巴分词参考地址

    Git参考 https github com fxsjy jieba jieba 是一个python实现的中文分词组件 在中文分词界非常出名 支持简 繁体中文 高级用户还可以加入自定义词典以提高分词的准确率 它支持三种分词模式 精确模式 试
  • 自定义input[type="radio"]的样式

    对于表单 input type radio 的样式总是不那么友好 在不同的浏览器中表现不一 对单选按钮自定义样式 我们以前一直用的脚本来实现 不过现在可以使用新的伪类 checkbox 来实现 如果直接对单选按钮设置样式 那么这个伪类并不实
  • [错误解决]paramiko.ssh_exception.SSHException: Error reading SSH protocol banner 设置

    报错信息 上午的时候数据组的同事跟我说有几个程序报错 经过查看log发现找到报错信息 paramiko ssh exception SSHException Error reading SSH protocol banner 经过搜索 得知
  • Callable异步原理简析

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net u012664375 article details 66967687 Callable异步执行 应该不会陌生 那么在java中是怎么用的呢 又是如
  • angular抛出 ExpressionChangedAfterItHasBeenCheckedError错误分析

    当变更检测完成后又更改了表达式值时 Angular 就会抛出 ExpressionChangedAfterItHasBeenCheckedError 错误 Angular 只会在开发模式下抛出此错误 在开发模式下 Angular 在每次变更
  • plt.imshow显示cv2读取的图像颜色不对的解决方案

    plt imshow显示cv2读取的图像颜色不对的解决方案 plt imshow与cv2 imshow显示同一图像颜色不一致 原理 Opencv cv2 imread 所读取的图像格式 每个像素为 B G R 的形式 cv2 imshow
  • ST源码分析-Clion调试

    lookupdns 是 ST 的一个示例程序 由于 ST 是 makefile 的项目 并没有提供 CMake 文件 所以先演示 一下 如何使用 Clion 来调试 Makefile 的项目 也可以使用 gdb 调试 不过我个人习惯 用 C
  • L1-017 到底有多二

    1 题目详情 一个整数 犯二的程度 定义为该数字中包含2的个数与其位数的比值 如果这个数是负数 则程度增加0 5倍 如果还是个偶数 则再增加1倍 例如数字 13142223336是个11位数 其中有3个2 并且是负数 也是偶数 则它的犯二程
  • linux下利用nohup后台运行jar文件包程序

    Linux 运行jar包命令如下 方式一 java jar XXX jar 特点 当前ssh窗口被锁定 可按CTRL C打断程序运行 或直接关闭窗口 程序退出 那如何让窗口不锁定 方式二 java jar XXX jar 代表在后台运行 特
  • react学习之class中this

    class Demo extends React Component handle console log this render return div 点击我 div 控制台会显示undefined 因为在class中 自定义方法会自动加
  • Edge插件导入到chrome浏览器

    在 Edge 浏览器输入 edge version 按回车键后 可以看到 用户配置路径 xxx 复制下来 粘贴到文件管理器 然后找到Extensions 文件夹 打开文件夹 此时会看到一大堆文件夹 这里对应的是你安装的插件多少 然后我们打开
  • 12.PageHelper-来自官网

    分页插件 pageHelper 官网 https pagehelper github io 使用方法 1 引入分页插件 引入分页插件有下面2种方式 推荐使用 Maven 方式 1 引入 Jar 包 你可以从下面的地址中下载最新版本的 jar
  • 安装C++的torch

    找到自己的cuda版本 nvcc version 我的输出是这样的 nvcc NVIDIA Cuda compiler driver Copyright 2005 2020 NVIDIA Corporation Built on Mon O
  • 美国设计师Aaron的Logo设计欣赏

    2007 02 16 作者 Aaron 出处 sj63 Aaron 来自美国洛杉矶 主要从事商标 标志设计
  • 解决HuggingFace加载预训练模型时报错TypeError: expected str, bytes or os.PathLike object, not NoneType

    完整报错 TypeError expected str bytes or os PathLike object not NoneType 解决方法 检查下载的组件 步骤1 完整的下载组件 包括bin文件的模型 配置文件和其他文件 尤其是to
  • 数据库系统原理练习题(十三)

    1 在数据库设计中 用E R图来描述信息结构但不涉及信息在计算机中的表示 它是数据库设计的 阶段 A 需求分析 B 概念设计 C 逻辑设计 D 物理设计 将E R模型转换成关系模型 属于数据库的 A 需求分析 B 概念设计 C 逻辑设计 D
  • AB实验的高端玩法系列4- 实验渗透低?用户未被触达?CACE/LATE

    CACE全称Compiler Average Casual Effect或者Local Average Treatment Effect 在观测数据中的应用需要和Instrument Variable结合来看 这里我们只讨论CACE的框架给
  • Java泛型的协变和逆变

    1 什么是泛型擦除 Java的泛型本质上不是真正的泛型 而是利用了类型擦除 type erasure 2 协变 covariant 和逆变 contravariant 2 1协变 covariant