Effective Java~26. 不要使用 raw type
在编译完成之后尽快发现错误是值得的,理想情况是在编译时
在泛型被添加到 Java 之前,这是一个典型的集合声明
// Raw collection type - don't do this!
// My stamp collection. Contains only Stamp instances.
private final Collection stamps = ... ;
如果你今天使用这个声明,然后不小心把 coin 实例放入你的 stamp 集合中,错误的插入编译和运行没有错误(尽管编译器发出一个模糊的警告):
// Erroneous insertion of coin into stamp collection
stamps.add(new Coin( ... )); // Emits "unchecked call" warning
直到您尝试从 stamp 集合中检索 coin 实例时才会发生错误
// Raw iterator type - don't do this!
for (Iterator i = stamps.iterator(); i.hasNext(); )Stamp stamp = (Stamp) i.next(); // Throws ClassCastExceptionstamp.cancel();
例外
类字面值(class literals)
List.class ,String[].class 和 int.class 都是合法的
List<String>.class 和 List<?>.class 不是合法的
instanceof 操作符
因为泛型类型信息在运行时被删除,所以在无限制通配符类型以外的参数化类型上使用 instanceof 运算符是非法的
以下是使用泛型类型的instanceof 运算符的首选方法:
// Legitimate use of raw type - instanceof operator
if (o instanceof Set) { // Raw typeSet<?> s = (Set<?>) o; // Wildcard type...
}
请注意,一旦确定 o 对象是一个 Set ,则必须将其转换为通配符 Set<?> ,而不是原始类型 Set 。 这是一个强制转换,所以不会导致编译器警告。
为了快速参考,下表中总结了本条目(以及本章稍后介绍的一些)中介绍的术语:
术语 | 中文含义 | 举例 | 所在条目 |
Parameterized type | 参数化类型 | List<String> | 条目 26 |
Actual type parameter | 实际类型参数 | String | 条目 26 |
Generic type | 泛型类型 | List<E> | 条目 26 |
Formal type parameter | 形式类型参数 | E | 条目 26 |
Unbounded wildcard type | 无限制通配符类型 | List<?> | 条目 26 |
Raw type | 原始类型 | List | 条目 26 |
Bounded type parameter | 限制类型参数 | <E extends Number> | 条目 29 |
Recursive type bound | 递归类型限制 | <T extends Comparable<T>> | 条目 30 |
Bounded wildcard type | 限制通配符类型 | List<? extends Number> | 条目 31 |
Generic method | 泛型方法 | static <E> List<E> asList(E[] a) | 条目 30 |
Type token | 类型令牌 | String.class | 条目 33 |
Effective Java~26. 不要使用 raw type相关推荐
- 第 3 次读 Effective Java,这 58 个技巧最值!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:Dong GuoChao <Effective ...
- 读完《Effective Java》后,总结了 50 条开发技巧
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Dong GuoChao 来源 | https ...
- Effective.Java第23-33条(泛型相关)
23. 类结构层次优于标签类 有时你会碰到一个类,它的实例有一个或多个风格,并且包含一个tag属性表示实例的风格.例如,如下面的类表示一个圆或者矩形: public class Figure {/* ...
- 《Effective Java》读书笔记 - 5.泛型
Chapter 5 Generics Item 23: Don't use raw types in new code 虽然你可以把一个List<String>传给一个List类型(raw ...
- 读完 Effective Java,我整理了 59 条技巧!(含pdf)
点击⬆️方"逆锋起笔",公众号回复 编程资源领取大佬们推荐的学习资料 上一篇:CTO 写低级 Bug,致公司 70 GB 数据泄露! 作者:Dong GuoChao 链接:http ...
- 一文简单理解《Effective Java》建议
考虑用静态工厂方法替代构造方法 传统的获取一个对象实例,通常是通过构造方法,new一个对象:不同数量的入参,会有不同的构造方法: 例如,统一的返回结果类,传统方式(伪代码)如下: //成功 retur ...
- \(^_^)/ Effective java
读<Effect Java中文版> 译者序 序 前言 第1章引言 1 第2章创建和销毁对象 4 第1条:考虑用静态工厂方法代替构造函数 4 第2条:使用私有构造函数强化singleto ...
- 5天带你读完《Effective Java》(三)
<Effective Java>是Java开发领域无可争议的经典之作,连Java之父James Gosling都说: "如果说我需要一本Java编程的书,那就是它了". ...
- 《Effective Java》真的是一本值得一直去钻研的好书
文章目录 <Effective Java>读书笔记 第一章 引言 第二章 创建和销毁对象 1 考虑使用静态工厂方法替代构造方法** 2 当构造方法参数过多时使用builder(建造者) 模 ...
最新文章
- django中的分页
- 深入理解CUDA线程层次以及关于设置线程数的思考
- Android Monkey测试入门(摘)
- 华为云.NET Core支持情况调查
- linux执行脚本n,Linux执行sh脚本空白
- explain分析SQL查询
- Scikit-learn:数据预处理Preprocessing data
- 详述支付路由的设计方案
- 软件工程 软件设计说明书模板
- SpringBoot 2.3.x gradle源码构建
- 我的Android进阶之旅------android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值
- rd630服务器系统,联想thinkserverRD630安装windowsserver2012
- 机器学习之降维方法总结
- 痛失阵地,又一家热门BT种子观影网站关停
- pada mysql
- opencv和magick两个图像处理库的使用心得
- 55 - 字符流中第一个不反复的字符
- php无限极分类整理
- TensorFlow ImportError: initialization failed
- 微信小程序——(2)智慧商圈、微信支付快速积分到账小程序开发指引
热门文章
- 论文浅尝 | 知识图谱中的链接预测:一种基于层次约束的方法
- 技术动态 | 藏经阁计划发布一年,阿里知识引擎有哪些技术突破?
- 说实话:中文自然语言处理(知识图谱)的N个真实情况
- 一文掌握深度学习、神经网络和学习过程的历史
- [随笔重写] Python3 的深拷贝与浅拷贝
- VisualVM远程监控Java
- codeforces 264 B. Good Sequences(dp+数学的一点思想)
- Reporting Services 的伸缩性和性能表现规划(转载)
- 10年软件开发教会我最重要的10件事[转]
- Javascript里使用Dom操作Xml