读书笔记-Effective Java(泛型)
26.请不要使用原生态类型
原生态类型就像重类型声明中删除了所有的泛型信息。
例外;
- 类文字中必须使用原生态类型,比如List< String >.class
- instanceof只能在原生态类型下使用,使用完,必须转为通配符类型
27.消除非受检的警告
如果无法消除非受检警告,同时可以证明引起警告的代码是类型安全的,可以使用@supressWarnings(“unchecked”)注解来禁止这条警告。
28.列表优于数组
- 数组是协变的
- 数组是具象化的,即泛型只在编译时有用。
数组提供了运行时的类型安全,但是没有编译时的类型安全,反之,对于泛型也一样。
29.优先考虑泛型
30.优先考虑泛型方法
31.利用有限制通配符来提升API的灵活性
有限制的通配符类型
Iterable<? extends E> // E的某个子类型的Iterable接口
Collection<? super E> // E的某种超类集合
PECS:producer-extends,Consumer-super
不要用通配符类型作为返回类型
如果类型参数只在方法中出现过一次,就可以用通配符替代它
32.谨慎并用泛型和可变参数
错误实例:
static void dangerous(List<String>... stringsList) {
List<Integer> intList = List.of(42);
Object[] objs = stringsList;
Object[0] = intList;
String s = stringsList[0].get(0);
}
static <T> pickTwo(T a, T b, T c) {
switch(TreadLocalRandom.current().nextInt(3)) {
case 0: return toArray(a, b);
case 1: return toArray(a, c);
case 2: return toArray(b, c);
}
throw new AssertionError();
}
允许另一个方法访问一个泛型可变参数组时不安全的
33.优先考虑类型安全的异构容器
Class< T>