在编译完成之后尽快发现错误是值得的,理想情况是在编译时

在泛型被添加到 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相关推荐

  1. 第 3 次读 Effective Java,这 58 个技巧最值!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:Dong GuoChao <Effective ...

  2. 读完《Effective Java》后,总结了 50 条开发技巧

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Dong GuoChao 来源 | https ...

  3. Effective.Java第23-33条(泛型相关)

    23.  类结构层次优于标签类 有时你会碰到一个类,它的实例有一个或多个风格,并且包含一个tag属性表示实例的风格.例如,如下面的类表示一个圆或者矩形: public class Figure {/* ...

  4. 《Effective Java》读书笔记 - 5.泛型

    Chapter 5 Generics Item 23: Don't use raw types in new code 虽然你可以把一个List<String>传给一个List类型(raw ...

  5. 读完 Effective Java,我整理了 59 条技巧!(含pdf)

    点击⬆️方"逆锋起笔",公众号回复 编程资源领取大佬们推荐的学习资料 上一篇:CTO 写低级 Bug,致公司 70 GB 数据泄露! 作者:Dong GuoChao 链接:http ...

  6. 一文简单理解《Effective Java》建议

    考虑用静态工厂方法替代构造方法 传统的获取一个对象实例,通常是通过构造方法,new一个对象:不同数量的入参,会有不同的构造方法: 例如,统一的返回结果类,传统方式(伪代码)如下: //成功 retur ...

  7. \(^_^)/ Effective java

    读<Effect Java中文版> 译者序 序 前言 第1章引言 1   第2章创建和销毁对象 4 第1条:考虑用静态工厂方法代替构造函数 4 第2条:使用私有构造函数强化singleto ...

  8. 5天带你读完《Effective Java》(三)

    <Effective Java>是Java开发领域无可争议的经典之作,连Java之父James Gosling都说: "如果说我需要一本Java编程的书,那就是它了". ...

  9. 《Effective Java》真的是一本值得一直去钻研的好书

    文章目录 <Effective Java>读书笔记 第一章 引言 第二章 创建和销毁对象 1 考虑使用静态工厂方法替代构造方法** 2 当构造方法参数过多时使用builder(建造者) 模 ...

最新文章

  1. django中的分页
  2. 深入理解CUDA线程层次以及关于设置线程数的思考
  3. Android Monkey测试入门(摘)
  4. 华为云.NET Core支持情况调查
  5. linux执行脚本n,Linux执行sh脚本空白
  6. explain分析SQL查询
  7. Scikit-learn:数据预处理Preprocessing data
  8. 详述支付路由的设计方案
  9. 软件工程 软件设计说明书模板
  10. SpringBoot 2.3.x gradle源码构建
  11. 我的Android进阶之旅------android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值
  12. rd630服务器系统,联想thinkserverRD630安装windowsserver2012
  13. 机器学习之降维方法总结
  14. 痛失阵地,又一家热门BT种子观影网站关停
  15. pada mysql
  16. opencv和magick两个图像处理库的使用心得
  17. 55 - 字符流中第一个不反复的字符
  18. php无限极分类整理
  19. TensorFlow ImportError: initialization failed
  20. 微信小程序——(2)智慧商圈、微信支付快速积分到账小程序开发指引

热门文章

  1. 论文浅尝 | 知识图谱中的链接预测:一种基于层次约束的方法
  2. 技术动态 | 藏经阁计划发布一年,阿里知识引擎有哪些技术突破?
  3. 说实话:中文自然语言处理(知识图谱)的N个真实情况
  4. 一文掌握深度学习、神经网络和学习过程的历史
  5. [随笔重写] Python3 的深拷贝与浅拷贝
  6. VisualVM远程监控Java
  7. codeforces 264 B. Good Sequences(dp+数学的一点思想)
  8. Reporting Services 的伸缩性和性能表现规划(转载)
  9. 10年软件开发教会我最重要的10件事[转]
  10. Javascript里使用Dom操作Xml