合理利用泛型擦除

2023-11-04

曾几何时,一直痛恨java的泛型擦除,为了适配老版的jdk,java引入泛型的同时,引入了泛型擦除机制,导致想要获取类中的泛型,需要都个圈子,具体可以看我这篇博客,获取泛型的类
前不久使用Mybatis-plus分页,但发现PO对象不满足接口出参数据,因此需要拼接数据转换成VO对象,但分页信息不变,刚想写个方法适配的,结果发现Mybatis-plus已经考虑到这点了,有个convert方法。具体如下:

    /**
     * IPage 的泛型转换
     *
     * @param mapper 转换函数
     * @param <R>    转换后的泛型
     * @return 转换泛型后的 IPage
     */
    @SuppressWarnings("unchecked")
    default <R> IPage<R> convert(Function<? super T, ? extends R> mapper) {
        List<R> collect = this.getRecords().stream().map(mapper).collect(toList());
      //此处强转,是为了通过setRecords方法对于List<T>的校验。为何不会报错:因为在运行期间IPage<R> 和Ipage<T>是一样的,里面存的类型其实是Object,强转后编译器就认为此时Records里面的类型是R,因此不会报错,运行时也不会报错。
        return ((IPage<R>) this).setRecords(collect);
    }
        /**
     * 设置分页记录列表
     */
    IPage<T> setRecords(List<T> records);

上述方法其实也有多种实现,如下
第一种(不强转)

    @SuppressWarnings("unchecked")
    default <R> IPage<R> convert(Function<? super T, ? extends R> mapper) {
    //此处不说明List集合里面的对象类型,List<T>和List<R>都是List对象,因此转成List可以绕过编译器检测,因为泛型擦除机制,运行时不会校验类型。
 List collect = this.getRecords().stream().map(mapper).collect(toList());
        return this.setRecords(collect);
    }

第二种(强转)

    @SuppressWarnings("unchecked")
    default <R> IPage<R> convert(Function<? super T, ? extends R> mapper) {
    //此处也是通过强转,绕过编译器检测,使其在编译期无法校验泛型的类型。
     List<R> collect = this.getRecords().stream().map(mapper).collect(toList());
        return ((IPage) this).setRecords(collect);
    }

如果你搞懂了上面的例子,你也就能明白下面的例子了

List<String> s = null;
List<Integer> i = null;
//报错
s = (List<Integer>)i;
List tmp = i;
//不报错
s = (List<String>) tmp;
//不报错
s = tmp;	

最后解释下上面的例子,s和i一开始就分别定义成List和List,
因此他们的数据类型是不一致的,所以无法赋值,强转也不行(因为已经显示说明了他们的数据类型了,此处得区别于(IPage®this的情况))。
而经过List tmp = i , 已经将数据类型擦除,绕开了编译器检测,因此 s = tmp
不会报错(可以认为是一种编译器优化,不需要显示强转,由程序员保证类型一致), s = (List<String>) tmp 也不会,直至显示调用get方法转换成String 对象时才会报Integer对象类型无法转换成String类型。

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

合理利用泛型擦除 的相关文章

  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 二分类变量相关性分析spss_【2026.】RC列联表(分类数据)的统计分析方法选择与SPSS实现...

    关注本号后 回复软件名称 即可拿到软件下载链接哦 分类资料在医学统计中很常见 有些统计学书上称为计数资料 比如 有效 无效 发病 不发病 男 女 血型 A B O AB 等等 分类资料一般根据频数整理成列联表的形式 一般的列联表多是二维的
  • 软件开发常用结构

    一 三层架构 1 三层架构包含的三层 界面层 User Interface layer 业务逻辑层 Business Logic Layer 数据访问层 Data access layer 2 三层的职责 1 界面层 表示层 视图层 主要功
  • 多核处理器下的快速包处理软件架构FastGate

    FastGate主要的目标是帮助用户缩短研发周期 保护已有的代码 快速开发和灵活部署自己的业务 用户无需关注多核处理器的硬件细节 无需关注性能和扩展性 只需专注于自身功能模块的开发 然后通过和FastGate框架的无缝集成便可以快速形成自己
  • npm 淘宝镜像的安装

    npm 淘宝镜像的安装 方法一 使用阿里定制的cnpm命令行工具代替默认的npm 输入以下代码 npm install g cnpm registry https registry npm taobao org 检查是否安装成功 cnpm
  • 关于${ }的用法-Linux shell编程小记

    关于 的用法 Linux shell编程小记 1 替换 裁剪 在shell编程中 当遇到需要将某个字符串进行替换或者裁剪时 我们首先想到的是sed和awk 但是sed和awk的功能都太强大了 当只是简单的对某个字符串进行替换裁剪时 我们可以
  • visual-studio-code – 如何更改VS Code的文件排序?

    visual studio code 如何更改VS Code的文件排序 时间 2019 03 09 标签 visual studio code 栏目 Visual Studio 在我的项目中 我有文件标记为day1 txt day2 txt
  • 图像处理反向投影原理

    反向投影的作用是什么 反向投影用于在输入图像 通常较大 中查找特定图像 通常较小或者仅1个像素 称为模板图像 最匹配的点或者区域 也就是定位模板图像出现在输入图像的位置 直接看原文 https blog csdn net yee yj ar
  • 【PhpStorm】插件集

    安装翻译插件Translation 使用方法 点击你需要翻译的英文即可 插件2 CodeGlance 这个插件可以添加代码地图 插件3 ApiDebuggerApiDebugger 可以做沉浸式开发 插件4 代码特效插件Power Mode
  • 深入浅出:CAN通信之CCP协议

    CCP CAN Calibration Protocol CAN标定协议 用于标定系统与ECU之间的通信 CCP协议在应用层 使用CAN的数据帧来传输命令 CRO数据帧 主设备向从设备发送 CRO报文 CCP报文帧格式为CMD CTR DA
  • 未明学院:从国企联通到金融科技随手记,学长告诉你国企和互联网私企差别有多大?

    作者 W同学 未明学院学员 在未明学院完成课程的学习后 成功拿下上汽通用五菱汽车股份有限公司数据工程师offer和香港城市大学资讯ISM研究生offer 正文 首先自我介绍 我是四川大学信息管理与信息系统专业2017届本科毕业生 辅修了财务
  • CSS的基本使用

    CSS的基本使用一 1 CSS基本语法 CSS样式由选择器和一条或多条以分号隔开的样式声明组成 每条声明的样式包含着一份CSS属性和属性值 选择器名 属性 属性值 属性 属性值 div background color red 注意 css
  • 详解 http

    TCP IP 基础 在学习http之前 我们需要先了解一下TCP IP 网络基础 我们通常使用的网络 包括互联网 都是在TCP IP协议族的基础上运行的 而http则属于它内部的一个子集 TCP IP 分层 TCP IP 协议族按层次分 可
  • 前端Vue自定义加载loading组件 通过设置gif实现loading动画 可用于页面请求前loading

    前端Vue自定义加载loading组件 提高用户体验的关键 随着技术的发展 前端开发也变得越来越复杂 传统的一次性整体开发方式已经无法满足现代Web应用程序的需求 为了解决这个问题 我们引入了一种新的开发方式 组件化开发 组件化开发可以将一
  • 将编程上升为中小学主要学科课程,真的靠谱吗?

    近日 有人建议将 编程 上升为中小学主要学科课程 并列入 中高考升学考试体系 此话题瞬间引发广大家长及IT互联网圈内人士热议 褒贬不一 对此 我觉得网上的一种观点非常对 孩子们现阶段需要的是思想和素质教育 而不是单纯地通过某一类技工学科的学
  • 2023最新信息安全毕业设计题目选题大全

    0 简介 毕业季马上就要开始了 不少同学询问学长网安专业选题以及开题相关的问题 今天跟大家分享信息安全毕设选题 最新的信息安全 网络安全 专业毕设选题 难度适中 适合作为毕业设计 大家参考 学长整理的题目标准 相对容易 工作量达标 题目新颖
  • STM32CubeMX之RTC的使用

    本篇文章介绍STM32实时时钟 RTC 的使用方法 前期准备 STM32硬件电路板及仿真器 以STM32F407ZGT6单片机为例 Keil v5以上版本 MDK ARM 串口助手 实时时钟 RTC 是STM32单片机的标配 每个系列的都有
  • yolov5运行报错之RuntimeError: The size of tensor a (80) must match the size of tensor b (56) at.....

    错误 RuntimeError The size of tensor a 80 must match the size of tensor b 56 at non singleton dimension 3 如图 解决方法 https gi
  • idea登录github时出现Invalid authentication data. connect time out问题解决方法

    辛辛苦苦注册好GitHub 安装了git客户端 弄好ssh后 用IDEA登录GitHub账号 又出现问题了 好吧 一番搜查之下终于找到了解决办法 问题图如下 解决办法 file gt setting gt system settings去掉
  • Style 中的 ‘>>>‘ 与 ‘ /deep/(sass/less)‘介绍

    Vue style 深度作用选择器 这两个深度选择器的主要作用就行修改UI库中的默认样式 gt gt gt page gt gt gt van skeleton margin top 10px gt gt gt van skeleton t
  • 合理利用泛型擦除

    曾几何时 一直痛恨java的泛型擦除 为了适配老版的jdk java引入泛型的同时 引入了泛型擦除机制 导致想要获取类中的泛型 需要都个圈子 具体可以看我这篇博客 获取泛型的类 前不久使用Mybatis plus分页 但发现PO对象不满足接