首页 > 编程语言 >java~类型的逆变和协变

java~类型的逆变和协变

时间:2024-01-11 15:02:35浏览次数:29  
标签:QueryWrapper java 逆变 子类 List 协变 Consumer

在 Java 中,泛型的逆变(contravariance)和协变(covariance)是涉及到泛型类型转换时的两个重要概念。

协变(Covariance)

协变指的是子类型对象可以赋值给父类型引用的情况。在泛型中,协变表示如果 BA 的子类,那么 List<B> 就是 List<A> 的子类。这意味着你可以将 List<B> 赋值给 List<A>,但只能读取 List<A> 中的元素,不能向其中添加任何元素。

示例代码:

List<? extends Number> numbers = new ArrayList<Integer>();

逆变(Contravariance)

逆变指的是父类型对象可以赋值给子类型引用的情况。在泛型中,逆变表示如果 BA 的子类,那么 Consumer<A> 就是 Consumer<B> 的子类。这意味着你可以将 Consumer<A> 赋值给 Consumer<B>,并且可以向其中添加 B 类型的元素,但不能读取其中的元素。

示例代码:

Consumer<? super Integer> consumer = System.out::println;

mybatis-plus中的协变

 // 子类转成父类
  QueryWrapper<ReportLoginTypeHour> queryWrapper = new QueryWrapper<>();
  queryWrapper.lambda()
      .ge(ReportLoginType::getWindowStart, startDate.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli())
      .lt(ReportLoginType::getWindowStart, endDate.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli());

    QueryWrapper<ReportLoginType> queryWrapperMinute = new QueryWrapper<>();
    queryWrapperMinute.setEntity(queryWrapper.getEntity()); // 拷贝查询条件

 // 子类转成父类
List<ReportLoginType> list;
list = reportLoginTypeHourMapper.selectList(queryWrapper)
      .stream()
      .map(reportLoginTypeHour -> (ReportLoginType) reportLoginTypeHour)
      .collect(Collectors.toList());

标签:QueryWrapper,java,逆变,子类,List,协变,Consumer
From: https://www.cnblogs.com/lori/p/17958591

相关文章

  • java实体类中给引用类型对象直接赋值报错记录
    实体类TestModel,Attachment类也是一个实体类packagecom.sinochem.it.model;importcom.alibaba.fastjson.JSONObject;publicclassTestModel{intage;Stringname;JSONObjectobj;Attachmentattachment;publicAttachmentgetAttachment(){......
  • 记使用Arthas定位并解决Java应用死锁问题
    背景在一次生产环境部署后,我们的JavaWeb应用开始表现出严重的性能下降。用户报告说网页响应变得非常慢,有时甚至完全无响应。初步检查服务器资源和应用日志未发现明显的问题,我们怀疑可能是应用内部出现了死锁。引入Arthas为了不影响生产环境运行,我们决定使用Arthas进行问题诊断。Ar......
  • 大话 JavaScript(Speaking JavaScript):第三十一章到第三十三章
    第三十一章:模块系统和包管理器原文:31.ModuleSystemsandPackageManagers译者:飞龙协议:CCBY-NC-SA4.0JavaScript没有内置模块支持,但社区已经创建了令人印象深刻的解决方法。要管理模块,可以使用所谓的包管理器,它们处理发现、安装、依赖管理等。模块系统JavaScript模......
  • 大话 JavaScript(Speaking JavaScript):第二十一章到第二十五章
    第二十一章:数学原文:21.Math译者:飞龙协议:CCBY-NC-SA4.0Math对象用作多个数学函数的命名空间。本章提供了一个概述。数学属性Math的属性如下:Math.E欧拉常数(e)Math.LN22的自然对数Math.LN1010的自然对数Math.LOG2Ee的底数2对数Math.LOG10Ee的十进制对数Ma......
  • [转]JAVA使用LocalDate获取当前日期所在季度的开始日期和结束日期
    原文地址:JAVA使用LocalDate获取当前日期所在季度的开始日期和结束日期-yvioo-博客园需要使用jdk1.8及以上  /***获取当前日期所在季度的开始日期和结束日期*季度一年四季,第一季度:1月-3月,第二季度:4月-6月,第三季度:7月-9月,第四季度:10月-12月......
  • 大话 JavaScript(Speaking JavaScript):第二十六章到第三十章
    第四部分:提示,工具和库原文:IV.Tips,Tools,andLibraries译者:飞龙协议:CCBY-NC-SA4.0本部分提供了使用JavaScript的技巧(最佳实践,高级技术和学习资源),并描述了一些重要的工具和库。第二十六章:元代码风格指南原文:26.AMetaCodeStyleGuide译者:飞龙协议:CCBY-NC-SA......
  • 大话 JavaScript(Speaking JavaScript):第十一章到第十五章
    第十一章:数字原文:11.Numbers译者:飞龙协议:CCBY-NC-SA4.0JavaScript对所有数字都使用单一类型:它将它们全部视为浮点数。但是,如果小数点后没有数字,则不显示小数点:>5.0005在内部,大多数JavaScript引擎都会优化并区分浮点数和整数(详情请参见JavaScript中的整数)。但这......
  • 大话 JavaScript(Speaking JavaScript):第十六章到第二十章
    第十六章:变量:作用域、环境和闭包原文:16.Variables:Scopes,Environments,andClosures译者:飞龙协议:CCBY-NC-SA4.0本章首先解释了如何使用变量,然后详细介绍了它们的工作方式(环境、闭包等)。声明变量在JavaScript中,您在使用变量之前通过var语句声明变量:varfoo;foo......
  • 大话 JavaScript(Speaking JavaScript):第一章到第五章
    第一部分:JavaScript快速入门原文:I.JavaScriptQuickStart译者:飞龙协议:CCBY-NC-SA4.0这部分是JavaScript的一个独立快速介绍。你可以在不阅读本书中的其他内容的情况下理解它,本书的其他部分也不依赖于它的内容。然而,阅读本书的提示在阅读本书的提示中适用。第一章:基......
  • java中调用exe程序和问题处理
    常规方法如下:publicclassRunExe{publicstaticvoidmain(String[]args){try{//exe文件的完整路径StringfilePath="C:\\path\\to\\your\\program.exe";//运行exe程序Processp=Runtime.......