Raw use of parameterized class 'Future'
最近在编码过程中发现一个警告。代码如下:
List<Future> futureList = new ArrayList<>(2);
警告:Raw use of parameterized class 'Future' Inspection info: Reports any uses of parameterized classes where the type parameters are omitted. Such raw uses of parameterized types are valid in Java, but defeat the purpose of using type parameters, and may mask bugs. This inspection mirrors the rawtypes warning of javac.
翻译如下:参数化类型“Future”的原始使用。检查信息:指出省略了类型的参数化类的使用。这种对参数化类型的原始使用在Java中是有效的,但是会破坏使用类型参数的目的,并可能掩盖错误。此检查反映了编译阶段对原始类型的警告。
解析:List<Future>
:参数化类型,表示元素类型为Future的列表;List
:是与参数化类型相对应的原生态类型;原生态类型List
和Java平台没有泛型之前的接口类型完全一样;List<E>
:泛型;E
:形式类型参数;
那为什么不建议使用原生态类型呢?
答:使用原生态类型会丢失泛型在安全性和表述性方面掉的所有优势。
举个例子:
List list = new ArrayList();
list.add("123");
list.add(1L);
list.add(0.11d);
for (Object o : list) {
double a = (double) o;
}
这段代码就是直接使用原生态类型的实现,在编译时期不会有任何问题,但是一旦运行就会报错:Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double,代码设计应该使错误尽早被发现,而这就是不安全的表现了,而且可读性而言,缺少了形式类型参数,我们很难明白List存储的类型是什么,表述性变差;
例外
- 类文字中必须使用原生态类型,意思是List.class、int.class合法,但是List.class不合法;
- 在参数化类型而非无限制通配符类型上使用instanceof的行为是非法的,而使用无限制通配符代替原生态类型,对instanceof不会产生任何影响;
- 创建泛型、参数化类型或者类型参数的数组是非法的;
这些例外都源于:泛型信息可以在运行时被擦除;泛型,只存在于代码的编译阶段,并且会在运行时候擦除它们的元素类型信息。擦除就是使泛型可以与没有使用泛型的代码可以随意进行互用;
解决最开始遇到的问题
代码本身没有问题,也使用了参数化类型,但是值得注意的是Future也是一个泛型类。修改如下则不会再有警告:
List<Future<ADXParam>> futureList = new ArrayList<>(2);
但是当我修改后,
这行又报错了,深入进去看到vertx并不规范的源码:
static CompositeFuture join(List<Future> futures) {
return CompositeFutureImpl.join(futures.toArray(new Future[futures.size()]));
}
这该如何是好呢? 首先我确定我的使用是安全的,不会在运行时候导致错误,则可通过 @SuppressWarnings("rawtypes")消除使用原生态类型警告。
- Delegate如何进行类型转换?
- 个性化推荐系统(一)---今日头条等的内容划分、分类
- ASP.NET Core的配置(2):配置模型详解
- 如何解决jQuery Validation针对动态添加的表单无法工作的问题?
- 数据结构 链表改进
- 数据结构 栈&队列
- 终端品牌域名过期被拍卖 价值六位数
- TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络
- ASP.NET的路由系统:路由映射
- ASP.NET Core的配置(3): 将配置绑定为对象[上篇]
- ASP.NET的路由系统:URL与物理文件的分离
- 使用Excel分析CloudStack使用记录
- 卷积神经网络初探索
- TensorFlow 深度学习笔记 逻辑回归 实践篇
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- web.py使用不当可能造成代码执行
- 《redis设计与实现》1-数据结构与对象篇
- 《redis设计与实现》2-数据库实现篇
- 利用location来变形我们的XSS Payload
- docker-compose部署单机版本分片mongo
- 一个前端DOMXSS过滤器
- docker-swarm部署mongo分片集群
- lnmp虚拟机安全配置研究
- 遇到一个有趣的逻辑漏洞
- discuz7.2 faq.php 最新注入漏洞分析
- XDCTF2014 部分Writeup
- Centos7安装k8s集群1.15.0版本
- MSSQL语句执行工具asp版
- springboot版本helloworld发布到k8s示例
- 《K8S权威指南》读书笔记-入门篇