首页 文章 精选 留言 我的

精选列表

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

[每日短篇] 25 - 如何解决 Java 泛型类型转换时的警告

问题 日常在写 Java 代码时对警告 Type safety: Unchecked cast from XXX to YYY 一定不会陌生,例如 Type safety: Unchecked cast from Object to Map<String,String>。如果仔细观察的话,可以注意到,YYY 从来不会是一个非泛型的类型。 原因 产生这个警告的原因是在强制类型转换时目标类型是一个非无边界通配符的泛型类型,而 Java 的半残泛型又无法在运行时判断一个泛型类型是否匹配目标类型。举个例子来说就是: Object source = Collections.singletonMap("a", 2); // #1 var target = (Map<String, String>) source; // #2 var value = target.get("a"); // #3 对于上面的代码,无法在 #2 行代码执行时就确认 target 是一个完全通过类型检查的值,当 #3 行代码执行时,还是会产生 java.lang.ClassCastException 异常;而从直觉上,如果 #2 行没有编译期错误或者运行时 java.lang.ClassCastException 异常,那 target 就是 Map<String, String> 类型的。在这个矛盾之下,在 #2 处产生 Type safety: Unchecked cast 警告提醒该行可能有问题,也是一种没有办法的办法。 前面提到了非无边界通配符的泛型类型,如果目标类型是无边界通配符的泛型类型,例如: Object source = Collections.singletonMap("a", 2); // #1 var target = (Map<?, ?>) source; // #2 上面代码中的 #2 行不会产生警告,因为这将指定具体的泛型参数类型这件事推迟到了后面的代码中,在这里只需要确定 source 是 Map 类型即可。 解决 1. 解决提出问题的人 最容易想到的,也是最普遍采用的方法自然是——当解决问题有困难时,解决提出问题的人。当然,我这是开个玩笑,虽然大家都知道编码实践中这才是主流。 例如在 Eclipse 中,这个警告受 Preferences > Java > Compiler > Errors/Warnings > Generic types > Unchecked generic type operation 选项控制,将其关闭即可。 对这个警告来说,由于它非常特定于泛型类型的转换,并且在这个问题上是整体没有好的解决方案,因此关掉也不会有什么实质性的影响。但是因为没有通用的关掉警告的方法,这种不可移植的方案难以让人接受。 另外,@SuppressWarnings("unchecked") 也可以让提出问题的人闭嘴。我希望它是被用在变量上面而不是方法上甚至模块上。使用这个注解的问题是,当对代码质量要求很高时,这个注解通常是被配置为忽略的,而试图消除警告的场景又往往与之高度重合。 2. 严谨的处理办法 前面提到了,无边界通配符类型因为延迟了类型指定而彻底符合了要求,我们可以把类型转换拆成多步,保证每一步都只转换确定的类型。当然,在这个场景下这叫没有困难创造困难也要上。 Object source = Collections.singletonMap("a", 2); // #1 var target = (Map<?, ?>) source; // #2 Object t = target.get("a"); // #3 // #4 if (t instanceof String) { // #5 String value = (String) t; // #6 } // #7 其中的繁琐和局限性一看便知。需要特别注意的是 #3 处 = 的右边失去了强类型的好处,似乎有些得不偿失。 3. 一个还算不错的处理方式 从前面给出的原因可以看到,在眼下以及可预见的未来,都没有简单而彻底的解决方法。好在这个警告主要是给有代码洁癖人带来麻烦,可以用一种代码级的方法几乎完整解决问题。只需要写一个工具类 public final class CastUtils { @SuppressWarnings("unchecked") public static <T> T cast(Object obj) { return (T) obj; } private CastUtils() { throw new UnsupportedOperationException(); } } 原来有警告的代码改为 Object source = Collections.singletonMap("a", 2); // #1 Map<String, String> target1= CastUtils.cast(source); // #2 var target2 = CastUtils.<Map<String, String>>cast(source); // #3 var value1 = target1.get("a"); // #4 var value2 = target2.get("a"); // #5 注意 #2 行、#3 行的不同写法,它们都能消除警告,但是 #2 写法更短,在绝大多数场景下更优一点。 CastUtils 类中依然使用到了 @SuppressWarnings("unchecked") 注解,如果该注解没有被配置为忽略,就能完全消除该警告,如果被配置为忽略,那也可以保持整个代码中仅有 1 处该警告,也就是几乎完整解决了问题。当然,还有另外一种选择,将 CastUtils 置于某个工具类库 jar 文件中,再把 jar 文件引用到项目中,无论 @SuppressWarnings("unchecked") 是否被配置为忽略,都可以彻底消除该警告。 总结 Type safety: Unchecked cast 是个说严重不严重,但是对整洁代码来说却不能无视的警告。如果自己有工具类库,在工具类库里增加 CastUtils 工具类是最好的选择。次优的选择则是将 CastUtils 工具类直接置于项目代码中。

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

大规模DDoS攻击降低了伊朗25%的互联网连接率

伊朗再次受到网络攻击,大规模的DDos攻击摧毁了伊朗很大一部分的互联网访问权限。根据专家解释,此次攻击规模巨大,导致伊朗全国互联网连接率下降至75%。 2020年2月8日,互联网观测站NetBlocks(主要跟踪互联网的终端和关闭情况)观测到该国互联网连接出现大规模中断。 证实:伊朗当地时间上午11:45(世界标准时间08:15)互联网部分关闭;实时网络数据显示,在当局启动“数字堡垒”隔离机制后,国家互联网连接下降至75%;事件仍在继续 https://t.co/Qb8bxYUT71 pic.twitter.com/bsETg1Sfxb — NetBlocks.org(@netblocks)2020年2月8日 据NetBlock称,在伊朗政府部署了“数字堡垒”(也称为sD DEZHFA/Dejfa)之后,就发现了互联网连通性问题。而NetBlocks互联网观测站的网络数据证实,伊朗电信网络在2020年2月8日(星期六)上午发生了持续数小时的大范围中断。 在当地时间大约11:45(08:15 UTC)的时候,伊朗主要的网络运营商的连接明显下降。关闭一小时后发现部分网络连接恢复,但其他网络则是在关闭后的7小时左右恢复,整个上午,伊朗全国互联网连接降到普通时段的75%. 2019年12月,伊朗电信部长Mohammad Javad Azari Jahromi宣布,伊斯兰共和国最近挫败了针对其政府基础设施的“高度有组织的网络攻击”。 2019年10月,在Qatar举行的Munich Security Conference(MSC)网络安全峰会上,AzariJahromi致辞,表示代号“数字堡垒” (Dejfa) 的国家级网络安全项目在2018年期间阻止了3300万次网络攻击。 据专家称,此次伊朗遭受的互联网中断影响了一部分网络运营商。但信息通信技术部官员证实,数字堡垒系统阻止了了分布式拒绝服务(DDoS)攻击,即伊朗基础设施受到攻击时,网络已被禁用。而伊朗电信基础设施公司的发言人通过Twitter也证实,DDoS攻击已“正常化”。 在当地时间11:44,网络攻击导致伊朗互联网服务中断一个小时。分布式数字拒绝服务(DDoS)攻击被伊朗的数字堡垒(Dejfa)击退:信息通信技术部官员。 https://t.co/MCxkpngeC2 ——Khosro Kalbasi(@KhosroKalbasi)2020年2月8日 事实上,几个月来伊朗多次面临网络中断,其中一些是内部因素造成的。比如去年12月,伊朗电信部长宣布一周内2次打击了针对其基础设施的网络攻击。同年11月,在政府宣布削减燃油补贴后,伊朗爆发抗议活动,当局封锁互联网接入,防止新闻、视频和图片在网上传播。 虽然NetBlocks指出,观察结果显示这是一次针对性的攻击,但《金融论坛报》认为,没有证据表明此次袭击是由一个国家行为体发起的。 Bonabi告诉《金融论坛报》:目前还没有发现任何国家支持此次袭击的迹象。攻击的来源和目的地高度分散,而且DDoS攻击使用了来自东亚和北美的伪造源IP。

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

1月25日云栖精选夜读 | 在阿里,我们如何管理测试环境

在阿里,我们如何管理代码分支,阿里的许多实践看似简单,背后却蕴涵着许多思考,譬如测试环境的管理。 互联网产品的服务通常是由Web应用、中间件、数据库和许多后台业务程序组成的,一套运行环境就是一个自成一体的小生态。 热点热议 在阿里,我们如何管理测试环境 作者:云效鼓励师 偷偷告诉你,在阿里待满五年的秘密…… 作者:技术小能手发表在:阿里味儿 一位技术校招生在支付宝的成长笔记 作者:技术小能手发表在:阿里技术 知识整理 病毒木马防御与分析实战 作者:奶berber Spring Cloud OAuth2 资源服务器CheckToken 源码解析 作者:gggggwww SpringBoot三部曲之Controller 请求日志切面 AOP 作者:ritit 事务隔离级别 作者:动力节点 redis单例部署 作者:lixianfa1110 美文回顾 如何在基于Bytom开发过程中使用Bigchaindb 作者:比原链bytom 实用贴:hadoop系统下载安装教程 作者:大数据资讯 5G背后那些你不知道的事儿,一对一直播app源码加速系列 作者:qq2954023423 3条建议,助您迈出容器策略第一步! 作者:docker公司发表在:Docker公司 大数据与人工智能不可斩断的渊源…… 作者:大数据风风 啥是佩琦?Python知识库大全让你一键“配齐” 作者:python小能手发表在:python技术进阶 来了!阿里开源分布式事务解决方案 Fescar 作者:云攻略小攻 有奖话题讨论 快过年了,你的Bug改完了吗? 戳链接晒图啦!2019你被贴上了哪个新年标签?!“苟富柜”还是“程序圆”... 往期精彩回顾 1月24日云栖精选夜读 | 毕玄:我在阿里的十年技术感悟 1月23日云栖精选夜读 | 重磅福利,阿里云携手合作伙伴向公益机构免费提供40多种软件服务! 1月22日云栖精选夜读 | 阿里云智能总裁张建锋:云更应该是CEO关心的问题 1月21日云栖精选夜读 | 阿里云连续3年位居中国第一,“云更应该是CEO关心的问题”;分布式事务解决方案 Fescar 开源 1月18日云栖精选夜读 | Euler 今日问世!国内首个工业级的图深度学习开源框架,阿里妈妈造

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

《从零开始学Swift》学习笔记(Day 25)——类和结构体定义

Swift中的类和结构体定义的语法是非常相似的。类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: 1 2 3 4 5 6 class 类名{ 定义类的成员 } struct结构体名{ 定义结构体的成员 } 从语法格式上看,Swift中的类和结构体的定义更类似于Java语法,不需要像C++和Objective-C那样把接口部分和实现部分放到不同的文件中。 下面来看一个示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 class Employee{ //定义的类 varno:Int= 0 varname:String= "" varjob:String? varsalary:Double= 0 vardept:Department? } structDepartment{ //定义的结构体 varno:Int= 0 varname:String= "" } 里面定义了一些属性。 Employee和Department是有关联关系的。 下列语句实例化: 1 2 letemp=Employee() vardept=Department() Employee()和Department()是调用它们的构造函数实现实例化。 注意:类声明为let常量还是var变量呢?从编程过程讲类一般声明为let常量,由于类是引用数据类型,声明为let常量只是说明不能修改引用,但是引用指向的对象可以被修改。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1746423,如需转载请自行联系原作者

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

老罗Android开发视频教程 (android常用UI编程) 25集集合

(android常用UI编程)第一集TextView如何显示丰富的文本http://www.apkbus.com/android-94717-1-1.html (android常用UI编程)第二集TextView显示表情图像和文字http://www.apkbus.com/android-94718-1-1.html (android常用UI编程)第三集TextView单击链接弹出Activityhttp://www.apkbus.com/android-94719-1-1.html (android常用UI编程)第四集TextView实现跑马灯效果http://www.apkbus.com/android-94720-1-1.html (android常用UI编程)第五集EditText输入表情图像http://www.apkbus.com/android-94721-1-1.html (android常用UI编程)第六集EditText中输入特定的字符http://www.apkbus.com/android-94764-1-1.html (android常用UI编程)第七集AutoCompleteTextView自动完成输入内容http://www.apkbus.com/android-94765-1-1.html (android常用UI编程)第八集Button按钮的焦点变化http://www.apkbus.com/android-94766-1-1.html (android常用UI编程)第九集Button图文混排的按钮http://www.apkbus.com/android-94767-1-1.html (android常用UI编程)第十集RadioButton单选按钮的使用http://www.apkbus.com/android-94768-1-1.html (android常用UI编程)第十一集ToggleButton按钮的使用http://www.apkbus.com/android-94769-1-1.html (android常用UI编程)第十二集CheckBox复选框控件使用http://www.apkbus.com/android-94770-1-1.html (android常用UI编程)第十三集SeekBar拖动控件的使用http://www.apkbus.com/android-94771-1-1.html (android常用UI编程)第十四集ImageView的基本用法http://www.apkbus.com/android-94772-1-1.html (android常用UI编程)第十五集ImageView实现适屏和裁剪图片的功能http://www.apkbus.com/android-94774-1-1.html (android常用UI编程)第十六集ImageView实现图片旋转和缩放功能http://www.apkbus.com/android-94775-1-1.html (android常用UI编程)第十七集ImageView从网络上获取图像http://www.apkbus.com/android-94777-1-1.html (android常用UI编程)第十八集DatePicker输入日期控件的使用http://www.apkbus.com/android-94778-1-1.html (android常用UI编程)第十九集时间对话框的使用http://www.apkbus.com/android-94779-1-1.html (android常用UI编程)第二十集ProgressBar进度条的使用http://www.apkbus.com/android-94780-1-1.html (android常用UI编程)第二十一集RatingBar评分控件的使用http://www.apkbus.com/android-94781-1-1.html (android常用UI编程)第二十二集ScrollView垂直滚动控件的使用http://www.apkbus.com/android-94783-1-1.html (android常用UI编程)第二十三集HorizontalScrollView水平滚动控件的使用http://www.apkbus.com/android-94786-1-1.html (android常用UI编程)第二十四集Gallery画廊控件http://www.apkbus.com/android-94787-1-1.html (android常用UI编程)第二十五集Spinner下拉列表控件http://www.apkbus.com/android-94788-1-1.html 本文转自qianqianlianmeng博客园博客,原文链接:http://www.cnblogs.com/aimeng/archive/2013/01/31/2888057.html ,如需转载请自行联系原作者

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

全新数据库治愈框架 版本 1.2.0-JDK1.8-SNAPSHOT

描述 针对saas 数据库隔离情况下,每次版本迭代都需要重新修改对应的数据库,对于升级与运维存在一定的难度,那么这个数据库治愈框架来了,使用场景如下 1.数据库不存在自动创建数据库 2.运行时表不存在自动创建表 3.运行时字段不存在自动根据策略完善表字段 依赖安装 top.wu2020 wu-database-lazy-mybatis-cure-plus-starter latest 版本功能 新增支持针对mybatis数据库自愈 支持运行时表丢失自动创建表 支持运行时字段存在自动创建字段 配置 启动类添加扫描迭代数据库模型注解 @LazyScan(scanBasePackages = {"com.wu.smart.acw.core.domain.uo", "com.wu.framework.inner.lazy.example.**.entity"}) 字段添加模型注解 import com.wu.framework.inner.lazy.stereotype.LazyTableField; @LazyTable() // 表注解 @LazyTableField() //字段 注解 数据库治愈插件源码地址

资源下载

更多资源
Mario

Mario

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

Spring

Spring

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册