04-泛型(26-33)
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)/