04-泛型(26-33)

image-20210216170604323

26. 不要使用原生态类型

如果使用像 List 这样的原生态类型,就会失掉类型安全性,但是如果使用像 List<Object> 这样的参数化类型,则不会。

List 原生态类型 和 List<Object> 参数化类型的区别:

  • 前者逃避了泛型检查
  • 后者明确告知编译器,它能够持有任意类型的对象

不能将任何元素(除了 null 之外)放到 Collection<?> 中。

必须在类文字(class literal) 中使用原生态类型。

27. 消除非受检的警告

要尽可能消除每一个非受检的警告。

如果无法消除警告,同时可以证明引起浸膏的代码是类型安全的,才可以用一个 @SuppressWarnings(“unchecked”) 注解来禁止这条警告。

应该始终在尽可能小的范围内使用 SuppressWarnings 注解。

28. 列表优于数组

列表类型是泛型的,可以在编译时就发现错误。

数组则在运行时才能发现错误。

29. 优先考虑泛型

30. 优先考虑泛型方法

31. 利用有限制通配符来提升 API 的灵活性

比如 使用时 Comparable<? super T> 优先于 Comparable<T>

32. 谨慎并用泛型和可变参数

将值保存在泛型可变参数数组参数中是不安全的。

对于每一个带有泛型可变参数或者参数化类型的方法,都要用 @SafeVarargs 进行注解。

33. 优先考虑类型安全的异构容器

异构容器,如 Map<Class<?>, Object>,每个键都可以有一个不同的参数化类型,一个可以使 Class<String>, 接下来是 Class<Integer>等…


04-泛型(26-33)
https://janycode.github.io/2020/09/16/02_编程语言/01_Java/04_EffectiveJava/04-泛型(26-33)/
作者
Jerry(姜源)
发布于
2020年9月16日
许可协议