首页 文章 精选 留言 我的

精选列表

搜索[提高],共10000篇文章
优秀的个人博客,低调大师

德哥PG系列课程直播(第15讲):PostgreSQL 新类型提高开发生产力

直播回顾 地址:https://yq.aliyun.com/live/909 知识点 知识点:JSON, ARRAY, RANGE 学习资料 1、PostgreSQL 店铺运营实践 - JSON[]数组 内部标签数据等值、范围检索100倍+加速示例 (含,单值+多值列合成) https://yq.aliyun.com/articles/501431标签:PostgreSQL , json , 数组 , 多值 , 等值 , 多值 , 一棵树 , 多颗树 , gin , btree , gist 2、PostgreSQL UDF实现tsvector(全文检索), array(数组)多值字段与scalar(单值字段)类型的整合索引(类分区索引) - 单值与多值类型复合查询性能提速100倍+ 案例 (含,单值+多值列合成)标签:PostgreSQL , 单值列 , 多值列 , GIN倒排索引 , 多值列变异 , 分区索引 , 分区表 , 变异索引 3、PostgreSQL 多重含义数组检索与条件过滤 (标签1:属性, 标签n:属性) - 包括UPSERT操作如何修改数组、追加数组元素标签:PostgreSQL , 多重函数数组 , UDF索引 , 过滤 , 文本处理 4、会议室预定系统实践(轻松解放开发) - PostgreSQL tsrange(时间范围类型) + 排他约束标签:PostgreSQL , tsrange , 范围 , exclude using , 排他约束 , btree_gist , 会议室预定 , 时间重叠 , 空间重叠 5、聊聊between and的坑 和 神奇的解法标签:PostgreSQL , 物联网 , 智能DNS , range , iprange , intrange , 排他约束 , GiST索引 往期回顾 PostgreSQL多场景阿里云沙箱实验(第14讲):PostgreSQL 数据清洗、采样、脱敏、批处理、合并 https://yq.aliyun.com/live/885PostgreSQL多场景阿里云沙箱实验(第13讲):PostgreSQL 图式关系数据应用实践 https://yq.aliyun.com/live/869PostgreSQL多场景阿里云沙箱实验(第12讲):PostgreSQL 物联网最佳实践https://yq.aliyun.com/live/846PostgreSQL多场景阿里云沙箱实验(第11讲):PostgreSQL 在社交应用领域的最佳实践 https://yq.aliyun.com/live/824PostgreSQL多场景阿里云沙箱实验(第10讲):PostgreSQL 时空调度数据库实践 https://yq.aliyun.com/live/807PostgreSQL多场景阿里云沙箱实验(第9讲):PostgreSQL 时空业务实践 https://yq.aliyun.com/live/794PostgreSQL多场景阿里云沙箱实验(第8讲):PostgreSQL 简单空间应用实践 https://yq.aliyun.com/live/783PostgreSQL多场景阿里云沙箱实验(第7讲):PostgreSQL 并行计算 https://yq.aliyun.com/live/733PostgreSQL多场景阿里云沙箱实验(第6讲):PostgreSQL 用户画像系统实践 https://yq.aliyun.com/live/710PostgreSQL多场景阿里云沙箱实验(第5讲):PostgreSQL 估值、概率计算 https://yq.aliyun.com/live/691PostgreSQL多场景阿里云沙箱实验(第4讲):PostgreSQL 实时多维分析 https://yq.aliyun.com/live/659PostgreSQL多场景阿里云沙箱实验(第3讲):PostgreSQL 实时搜索实践https://yq.aliyun.com/live/647PostgreSQL多场景阿里云沙箱实验(第2讲):PG秒杀场景实践https://yq.aliyun.com/live/615PostgreSQL多场景阿里云沙箱实验(第1讲):如何快速构建海量逼真测试数据https://yq.aliyun.com/live/594 主讲人 德哥(云栖社区昵称:德哥)阿里云数据库专家,PostgreSQL中国社区校长。 格言:公益是一辈子的事, I'm digoal, just do it. 专家已经在社区发布了1946篇技术博文,很快将突破2000篇。厉害了!想要成为德哥粉丝请直接点击这里。 直播时间 时间:2019年3月6日 19:30 直播地址 PostgreSQL技术进阶群,钉钉扫码入群看直播

优秀的个人博客,低调大师

浅谈如何提高自动化测试的稳定性和可维护性 (pytest&allure)

装饰器与出错重试机制 谈到稳定性,不得不说的就是“出错重试”机制了,在自动化测试中,由于环境一般都是测试环境,经常会有各种各种的抽风情况影响测试结果,这样就为测试的稳定性带来了挑战,毕竟谁也不想自己的脚本一天到晚的出各种未知问题,而往往这种环境的抽风(通常是前端页面的响应速度和后端接口的响应速度)带来的影响是暂时的,可能上一秒失败了,下一秒你再执行又好了,在这种情况下,如果你有一个出错重试机制,起码可以在这种暂时性的影响下让你的脚本安然无恙,下面我们具体的说一下做法。 什么是装饰器? 因为我们的做法依赖装饰器,所以在去做之前,先简单介绍一下装饰器。 装饰器,表现形式为,在方法(或者类)的上面加上@xxx这样的语句,假如我们已经实现了一个装饰器名叫retry,那么我们想用它就这么用: @retry def test_login(): print("test") error = 1/0 如果retry实现了出错再次重试(稍后再说如何实现),那么这么使用的话,就会让test_login这个case在执行出错的时候再次执行。 很神奇,让我们来看看实现retry的代码: def retry(func): def warp(): for time in range(3): try: func() except: pass return warp 就结果而言,执行以下代码: @retry def test_login(): print("test") error = 1/0 test_login() 和执行: retry(test_login)() 是等价的,由此我们可以看出,装饰器其实本质上就是一个函数,这个函数接收其他函数(或者类)作为参数,通过对这个函数(或者类)的调用或者修改,完成不更改原始函数而修改该函数的功能。 在这里还有一个知识点,你有没有想过,在retry内部的函数warp(),是怎么拿到func这个参数来执行的?执行retry函数return的是warp这个函数,而warp并没有接受func这个传参啊。 这就是python里的闭包的概念,闭包就是指运行时自带上下文的函数,比如这里的warp这个函数,他运行的时候自带了上层函数retry传给他的func这个函数,所以才可以在运行时对func进行处理和输出。 了解了装饰器和闭包,那么下面就很容易做到对测试用例的出错重试机制了。 如果对软件测试、接口测试、自动化测试、性能测试、LR脚本开发、面试经验交流。感兴趣可以来加群:747981058,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。 编写一个出错重试装饰器 现在,我们来尝试自己编写一个用于测试用例的出错重试装饰器,代码如下: def retry(times=3,wait_time=10): def warp_func(func): def fild_retry(*args,**kwargs): for time in range(times): try: func(*args,**kwargs) return except: time.sleep(wait_time) return fild_retry return warp_func 这个装饰器可以通过传入重试次数(times)和重试等待时间(wait_time),对待测用例实行重试机制。 pytest里的出错重试机制实现 在测试框架pytest里,已经实现了有关出错重试的策略,我们首先需要安装一个此类的插件,在cmd内执行以下命令安装: pip install pytest-rerunfailures 如果你需要将此机制应用到所有的用例上,那么请在执行的时候使用如下命令(reruns是重试次数): pytest --reruns 5 来执行你的用例; 如果你期望加上出错重试的等待时间,请使用如下命令(reruns-delay是等待时间): pytest --reruns 5 --reruns-delay 1 来执行你的用例; 如果你只想对某几个测试用例应用重试策略,你可以使用装饰器: @pytest.mark.flaky(reruns=5, reruns_delay=2) 例如: @pytest.mark.flaky(reruns=5, reruns_delay=2) def test_example(): import random assert random.choice([True, False]) 更详细的介绍请参阅官方文档。 Allure里的测试用例分层 刚刚我们实现了用例的出错重试机制,但是这仅仅解决了脚本在不稳定环境下的稳定性;如果还想要脚本变得更加容易维护,除了传统的po模式使用例和元素分离之外,我们还可以引入测试用例分层机制。 为什么要采用分层机制? 传统的po模式,仅仅实现了用例和元素分离,这一定层面上保障了用例的可维护性,起码不必头疼于元素的变更会让用例到处失效;但是这还不够,例如,现在有三个case,他们都包含了以下步骤:登录、打开工作台、进入个人中心;那么如果不做分层,这三个用例会把这三个步骤都写一遍,如果某天页面的变动导致其中一个步骤需要更改,那么你不得不去每个用例里去更新那个步骤。 而如果,我们把用例当做是堆积木,登录、打开工作台、进入个人中心这三个步骤都只是个积木,那么我们写用例的时候,只需要在用到这个步骤时,把积木搭上去;如果某一天,其中一个积木的步骤有变动,那么只需要去更改这个积木的内容,而无需在每个使用了这个积木的用例里去改动。 这大大增强了用例的复用性和可维护性,这就是采用分层机制的原因,下面,我会就allure里的分层机制做介绍来讨论具体如何实现。 allure的装饰器@step 在allure里,我们可以通过装饰器@step完成分层机制,具体的,当你用@step装饰一个方法时,当你在用例里执行这个方法,会在报告里,表现出这个被装饰方法;而@step支持嵌套结构,这就意味着,你可以像搭积木一样去搭你的步骤,而他们都会一一在报告里被展示。 下面直接用allure的官方示例作做举例: import allure import pytest from .steps import imported_step @allure.step def passing_step(): pass @allure.step def step_with_nested_steps(): nested_step() @allure.step def nested_step(): nested_step_with_arguments(1, 'abc') @allure.step def nested_step_with_arguments(arg1, arg2): pass def test_with_imported_step(): passing_step() imported_step() def test_with_nested_steps(): passing_step() step_with_nested_steps() 运行这个case后,报告是这样的: 可以看到, test_with_nested_steps由passing_step()和step_with_nested_steps()这两个方法组成; 而step_with_nested_steps()又由nested_step()组成; nested_step()又由nested_step_with_arguments(1, 'abc')组成; 这样就像搭积木一样,组成了测试用例;而在报告里,也层级分明的标识了步骤的嵌套结构。 这样,我们就可以通过一个又一个@step装饰的方法,组成测试用例;同时报告里也会支持层级显示;从而完成我们的分层机制。

优秀的个人博客,低调大师

阿里云智能软件机器人码栈,提高数千万人工作效率

码栈,以提升企业提效为目标,帮助用户连接不同的系统和服务,实现工作流程自动化。运用码栈能够显著将客服、运营、财务、法务、设计师以及更多领域的客户重复工作流高速化,提升岗位效率,进而提升企业效率。 码栈为电商、金融、游戏、政府、教育、财税、及传统大型企业等人力密集型企业提供一个高效引擎。在三个典型应用场景:数据采集、批量处理和系统协同中,码栈的效率是传统人工效率的数倍。以电商运营为例,每天重复工作包括:下载报表、整理汇总、售前催单、顾客答疑、订单监控、物流跟踪、售后退款、新品上架、内容核对、促销活动报名等多达数十个环节,优质电商会吸入巨大流量,而这样的流量往往意味着人员的大批量增加,码栈通过将工作流标准,规模化,实现了效率最大化,码栈可以自动实现数据对接,把ERP与售后系统对接起来。码栈配有应用市场,用户可以添加ISV提供SaaS企业

优秀的个人博客,低调大师

《UX最佳实践:提高用户体验影响力的艺术 》一2.2 什么是SAP Business ByDesign

2.2 什么是SAP Business ByDesign SAP Business ByDesign是SAP新推出的按需配置的企业管理解决方案,主要面向中小型企业。这一解决方案因其存在很多创新之处,可以使其区别于市场上的其他产品。SAP Business ByDesign是全球最完备、最灵活、按需配置的企业管理解决方案。与其他按需配置的企业管理软件不同,SAP Business ByDesign(见图2-2)让企业端到端的每个流程都更透明且易于掌控,这其中包含了客户关系管理(CRM)、供应商关系管理(SRM)、供应链管理(SCM)、财务管理(FIN)和人力资源(HR)。此方案让企业能立即对自己的情况进行360度掌握,并且它简单易用,能快速配合商业需求的变动。 SAP Business ByDesign设计时考虑了以下几个关键原则: 坚

优秀的个人博客,低调大师

华为应用市场预约1v1专家沟通服务,助力开发者提高上架效率

近日,华为应用市场正式面向开发者推出“预约1v1专家沟通服务”,旨在通过资深审核专家与开发者的深度交流,帮助开发者更清晰地理解应用审核政策、管控理念及相关要求,提升应用上架效率,开发者可以通过“应用推广引擎-联系我们”进行服务预约。 这项服务为开发者提供了与官方审核专家直接对话的“绿色通道”,无论是应用提审被拒后的深度诊断,新应用上架前的关键咨询,还是复杂功能合规性的探讨,开发者只需提交预约申请,便有机会与专家展开1v1深度交流。 该服务的核心在于“深度”与“精准”,开发者可以直接向资深审核专家提问,专家将结合鸿蒙的政策理念与管控要求,针对具体场景进行剖析,提供更具落地性的解决方案,确保方向正确。 为了保障服务实效,该机制还建立了高效的闭环管理措施。若有遗留问题,专家会进行再次沟通,确保需求彻底解决,不积压问题。这不仅帮助开发者规避了隐形沟通成本,更大幅缩短了应用从开发到上架的周期。 目前,每位开发者在每个自然年内可申请3次该服务,这不仅是华为应用市场对开发者支持的体现,更是鼓励开发者在明确有需要时,利用这一高效工具精准打磨应用。 未来,华为应用市场还将上线更多开发者专属服务,全方位助力开发者打造优质应用,持续为鸿蒙生态的繁荣发展注入动力。

优秀的个人博客,低调大师

DeepSeek-V3 API 优惠期结束,每百万输出 tokens 由 2 元提高至 8 元

DeepSeek-V3的API服务的“价格优惠”体验期已经结束,从2月9日开始调整为新的价格,相关情况,5G与6G公众号(ID:angmobile)总结并分析如下。 1、价格对比分析 输入Token费用 优惠期(以前):缓存命中0.1元/百万,缓存未命中1元/百万。 正常期(现在):统一2元/百万(缓存命中涨价2000%,未命中涨价100%)。 输出Token费用 优惠期(以前):2元/百万。 正常期(现在):8元/百万(涨幅300%)。 优惠体验期是一种常见的市场推广策略,在优惠期内吸引了大量用户尝试和使用DeepSeek-V3的API服务,积累了用户基础和市场口碑。 优惠期结束后调整价格,5G与6G公众号认为一方面可以筛选出对价格不敏感、真正有需求的长期用户,另一方面也为后续可能的价格策略调整和服务升级留出空间。 价格调整反映了DeepSeek考虑到了运营成本、服务器资源以及持续研发所需的资金投入。值得注意的是,尽管价格有所上涨,但5G与6G公众号注意到DeepSeek-V3与市场上其他高端AI模型比如OpenAI的GPT-4o相比仍然保持了较高的性价比(如下表所示)。 2、成本影响测算 假设典型场景:100万输入(50%缓存命中)+ 50万输出 优惠期(以前)成本:(0.1×50 + 1×50)+ 2×50 = 5+50+100=155元。 正常期(现在)成本:(2×100)+ 8×50 = 200+400=600元(成本增长287%) 优化使用方面,用户可能会更加注重优化token的使用,一是缓存策略优化,比如5G与6G公众号认为通过请求模式调整提升缓存命中率可将输入成本降低90%;此外针对对话类应用,可设计缓存+实时处理的混合架构。 价格并不是用户选择AI模型服务的唯一考量因素,DeepSeek-V3可以通过不断提升自身的性能、功能和服务质量,与竞争对手形成更大的差异化竞争。

优秀的个人博客,低调大师

鉴于 Go 语言的热门程度,GitHub 提高了 Go 模块的供应链安全性

Go 社区从诞生之初就积极拥抱了 GitHub,如今 GitHub 既是 Go 语言相关项目的代码协作平台,也是发布软件包的地方,也正因如此 Go 编程语言成为了 GitHub 最受欢迎的编程语言之一。为了改善 Go 模块在安全漏洞方面的发现、报告和预防,近日 GitHub 宣布了多项新功能以提升 Go 模块的供应链安全。 根据 GitHub 的说法,他们对 Go 模块在供应链安全方面主要有以下四个方面的改进: Advisories GitHub 的 Advisories Database 是一个开源的漏洞信息数据库,专注于为开发者提供高质量的、可操作的漏洞信息。它基于 Creative Commons Attribution 4.0 协议,所以数据可以在任何地方使用。到目前为止,该数据库已经发布了 150 多个相关内容,而且随着 GitHub 对现有漏洞的整理和对新发现漏洞的分类,这个数字将会每天得到增长。 如果你是 Go 模块的维护者,现在还可以使用 Security Advisories 来协调漏洞的披露。你可以与漏洞报告者(如安全研究人员)合作,在公开漏洞详情之前私下讨论并修复漏洞。Security Advisories 还可以让漏洞报告者为所发现的漏洞申请一个 CVE ID,并将它们发布到国家漏洞数据库(NVD)。 依赖关系图 GitHub 的依赖关系图分析了仓库的 go.mod 文件,以了解仓库的依赖关系。依赖关系图与安全公告一起,提供了提醒开发者注意漏洞依赖关系所需的信息。 依赖关系图对于公共仓库是默认启用的,但对于私有仓库来说,你必须手动启用它。为了帮助防止新的漏洞被引入,开发者可以在审查拉取请求时使用依赖性审查来查看对你的 go.mod 文件修改的影响。 Dependabot 警报 GitHub 还在这次更新中加入了 Dependabot,当 Go 模块中发现新的漏洞时,它会向开发者发出通知。通知设置也得到了升级,以便用户对想收到的通知类型进行微调。 Dependabot 安全更新 Dependabot 安全更新可以通过拉动请求,自动将有漏洞的 Go 模块升级到没有漏洞的版本。根据 GitHub 的调查,自动生成拉动请求以更新有漏洞的依赖关系的软件库比不生成拉动请求的软件库快40%。 Google Go 语言产品负责人 Steve Francia 表示:“GitHub 是最受欢迎的开源 Go 模块托管平台。宣布的新功能不仅可以帮助 GitHub 用户,还可以帮助任何依赖 GitHub 托管模块的开发者。我们很高兴 GitHub 在这方面进行的投资,使整个生态系统受益,我们期待着在未来与他们进行更多的合作。“ Go 模块于 2019 年推出,旨在改善依赖性管理。根据 Go Developer Survey 在 2020 年的调查显示,有 76% 的受访者都将 Go 以某种形式在企业中应用。此外,Go 模块的采用如今也在持续增加,96% 的受访者表示这些模块被用于进行软件包管理 —— 而 2019 年则仅有 87% 的受访者将 Go 模块用于这些目的。 调查呈现出来的一个总体趋势似乎表明,其他软件包管理工具的使用正在不断减少。而对 Go 模块的改善也将提升行业整体安全性。

优秀的个人博客,低调大师

【Java入门提高篇】Day15 Java泛型再探——泛型通配符及上下边界

上篇文章中介绍了泛型是什么,为什么要使用泛型以及如何使用泛型,相信大家对泛型有了一个基本的了解,本篇将继续讲解泛型的使用,让你对泛型有一个更好的掌握和更深入的认识。 上篇中介绍完泛型之后,是不是觉得泛型挺好用的?既消除了Object的不安全类型转化,又可以很方便的进行类型对象的存取,但是,等一下,有没有考虑到这样的情况。 我们先定义一个水果类: public class Fruit { private String name; public Fruit(String name){ this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 然后再定义一个苹果类: public class Apple extends Fruit{ public Apple(String name) { super(name); } } 接下来定义一个泛型容器: public class GenericHolder<T> { private T obj; public GenericHolder(){} public GenericHolder(T obj){ this.obj = obj; } public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } } 接下来开始我们的测试: public class Test { /** * 吃水果 * @param fruitHolder */ public static void eatFruit(GenericHolder<Fruit> fruitHolder){ System.out.println("我正在吃 " + fruitHolder.getObj().getName()); } public static void main(String args[]){ //这是一个贴了水果标签的袋子 GenericHolder<Fruit> fruitHolder = new GenericHolder<Fruit>(); //这是一个贴了苹果标签的袋子 GenericHolder<Apple> appHolder = new GenericHolder<Apple>(); //这是一个水果 Fruit fruit = new Fruit("水果"); //这是一个苹果 Apple apple = new Apple("苹果"); //现在我们把水果放进去 fruitHolder.setObj(fruit); //调用一下吃水果的方法 eatFruit(fruitHolder); //贴了水果标签的袋子放水果当然没有问题 //现在我们把水果的子类——苹果放到这个袋子里看看 fruitHolder.setObj(apple); //同样是可以的,其实这时候会发生自动向上转型,apple向上转型为Fruit类型后再传入fruitHolder中 //但不能再将取出来的对象赋值给redApple了 //因为袋子的标签是水果,所以取出来的对象只能赋值给水果类的变量 //无法通过编译检测 redApple = fruitHolder.getObj(); eatFruit(fruitHolder); //放苹果的标签,自然只能放苹果 appHolder.setObj(apple); // 这时候无法把appHolder 传入eatFruit // 因为GenericHolder<Fruit> 和 GenericHolder<Apple>是两种不同的类型 // eatFruit(appHolder); } } 运行结果: 我正在吃 水果 我正在吃 苹果 在这里,我们往eatFruit方法里传入fuitHolder的时候,是可以正常编译的,但是如果将appHolder传入,就无法通过编译了,因为作为参数时,GenericHolder<Fruit> 和 GenericHolder<Apple>是两种不同的类型,所以无法通过编译,那么问题来了,如果我想让eatFruit方法能同时处理GenericHolder<Fruit> 和 GenericHolder<Apple>两种类型怎么办?而且这也是很合理的需求,毕竟Apple是Fruit的子类,能吃水果,为啥不能吃苹果???如果要把这个方法重载一次,未免也有些小题大做了(而且事实上也无法通过编译,具体原因之后会有说明)。 在代码的逻辑里: 苹果 IS-A 水果 装苹果的盘子 NOT-IS-A 装水果的盘子 这个时候,泛型的边界符就有它的用武之地了。我们先来看效果: public class Test { /** * 吃水果 * @param fruitHolder */ public static void eatFruit(GenericHolder<? extends Fruit> fruitHolder){ System.out.println("我正在吃 " + fruitHolder.getObj().getName()); } public static void main(String args[]){ //这是一个贴了水果标签的袋子 GenericHolder<Fruit> fruitHolder = new GenericHolder<Fruit>(); //这是一个贴了苹果标签的袋子 GenericHolder<Apple> appHolder = new GenericHolder<Apple>(); //这是一个水果 Fruit fruit = new Fruit("水果"); //这是一个苹果 Apple apple = new Apple("苹果"); //现在我们把水果放进去 fruitHolder.setObj(fruit); //调用一下吃水果的方法 eatFruit(fruitHolder); //放苹果的标签,自然只能放苹果 appHolder.setObj(apple); // 这时候可以顺利把appHolder 传入eatFruit eatFruit(appHolder); } } 运行结果: 我正在吃 水果 我正在吃 苹果 这里我们只是使用了一点小小的魔法,把参数类型改成了GenericHolder<? extends Fruit>,这样就能将GenericHolder<Apple>类型的参数顺利传入了,怎么样?很好用吧,这就是泛型的边界符,用<? extends Fruit>的形式表示。边界符的意思,自然就是定义一个边界,这里用?表示传入的泛型类型不是固定类型,而是符合规则范围的所有类型,用extends关键字定义了一个上边界,也就是说这里的?可以代表任何继承于Fruit的类型,你也许会问,为什么是上边界,好问题,一图胜千言: 从这个图可以很好的看出这个“上边界”的概念了吧。有上边界,自然有下边界,泛型里使用形如<? super Fruit>的方式使用下边界,此时,?只能代表Fruit及其父类。 (这两个图是抠过来的,不要骂我懒。) 这两种方式基本上解决了我们之前的问题,但是同时,也有一定的限制。 1.上界<? extends T>不能往里存,只能往外取 不要太疑惑,其实很好理解,因为编译器只知道容器里的是Fruit或者Fruit的子类,但不知道它具体是什么类型,所以存的时候,无法判断是否要存入的数据的类型与容器种的类型一致,所以会拒绝set操作。 2.下界<? super T>往外取只能赋值给Object变量,不影响往里存 因为编译器只知道它是Fruit或者它的父类,这样实际上是放松了类型限制,Fruit的父类一直到Object类型的对象都可以往里存,但是取的时候,就只能当成Object对象使用了。 所以如果需要经常往外读,则使用<? extends T>,如果需要经常往外取,则使用<? super T>。 至此,本篇讲解完毕,欢迎大家继续关注! 真正重要的东西,用眼睛是看不见的。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册