目录
1.使用场景:
2.使用泛型的好处:
3. 注意点:
4.通配符:?
1.使用场景:
集合容器类 在设计阶段/声明阶段 不能确定实际存的是什么类型的对象
把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection<E>,List<E>,ArrayList<E> 这个<E>就是类型参数,即泛型。
2.使用泛型的好处:
- 只有指定的数据类型才能添加到集合中:编译时,就会进行类型检查,保证数据类型安全
Map<String,Integer> map = new HashMap<>(); //jdk7之后可以类型推断 - 避免了强转操作,强转时,可能出现ClassCastException
1. 遍历方式:方式一: for(Integer score : list){ }
方式二:Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
int stuScore = iterator.next();
System.out.println(stuScore);
}
3. 注意点:
- 集合接口或集合类 为带泛型的结构 (jdk5.0及以后)
- 泛型类可以有多个参数<E1,E2,E3>
- 泛型的类型必须是类,基本数据类型可用包装类
- 实例化集合类时,确定具体的泛型类型。且内部结构所用之处皆为实例化后的泛型类型
- 泛型 默认类型为java.lang.Object类型。
- 实例化子类对象时,不再需要指明泛型。泛型子类继承了父类的泛型类型
- 泛型方法在调用时,指明泛型参数的类型。泛型方法,可以声明为静态的
- 静态方法中不能使用类的泛型(在类、接口上声明的泛型)。
1. // public static void show(T orderT){ //错误的
// System.out.println(orderT);
// }
- 泛型不同的引用(引用数据类型)不能相互赋值。
- 泛型在继承方面的体现: 类A是类B的父类:
9. G<A> 和G<B>二者不具备子父类关系,二者是并列关系。
A<G> 是 B<G> 的父类 子类引用可以赋值给父类
4.通配符:?
4.1 G<A>和G<B>是并列关系,二者共同的父类是:G<?>
4.2 List<?> 添加读取
- 不能向其内部添加数据即list.add()(除了null可以),只能引用赋值(list = list1)
- 允许读取数据,读取的数据类型为Object。 Object o = list.get(0);
4.2 限制条件的通配符的使用。
? extends A:
G<? extends A> 可以作为G<A>和G<B>的父类,其中B是A的子类 A及以下都可以 ? super A:
G<? super A> 可以作为G<A>和G<B>的父类,其中B是A的父类 A及以上都可以
读取的数据类型为 包含范围较大的数据类型 即最高父类,否则编译不通过