一.4 集合 泛型
2.泛型
2.1泛型的概念
泛型:是一种末知的数据类型,当我们不知道使用什么数据类型的时候可以使用泛型泛型也可以看出是一个变量用来接收数据类型
E e: Element元素
TtType类型
ArrayList集合在定义的时候不知道集合中都会存储什么类型的数据,所以类型使用泛型E:末知的数据类型
public class ArrayList<E>{
public boolean add(E e) {}
public E get(int index) {}
创建集合对象的时候就会确定泛型的数据类型
ArrayList<String> list =new ArrayList<String>0:
2.2使用泛型的好处
/*创建集合对象,使用泛型 好处: 1.避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型 2.把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错) 弊端: 泛型是什么类型,只能存储什么类型的数据
不使用
创建集合对象,不使用泛型 好处: 集合不使用泛型,默认的类型就是object类型,可以存储任意类型的数据 弊端: 不安全,会引发异常 //会发生异常 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
2.3定义和使用带有泛型的类
义一个含有泛型的类,模拟ArrayList集合 泛型是一个未知的数据类型,当我们不确定什么什么数据类型的时候,可以使用泛型泛型可以接收任意的数据类型,可以使用Integer, String, Student... 创建对象的时候确定泛型的数据类型 定义泛型类:把带有String类等这些换成E,在类名称后面加上<E>. 使用泛型类:创建泛型类对象,泛型使用什么类,在<>里写什么类;
2.4定义和使用带有泛型的方法
2.5定义和使用含有泛型的接口
定义:在接口名称后面加<E>
/*接口的实现类 * 含有泛型的接口,第一中使用方法: * 定义接口的实现类,实现接口,指定接口的泛型 * */ /*迭代器的接口 public interface Iterator<E> { E next( ); } Scanner类实现了Iterator接口,并指定接口的泛型为String,所以重写的next方法泛型默认就是String public final class Scanner implements Iterator<String>{ public String next() {} } */ 使用://第一种,创建Demo03GenericIterfaceImpl对象, Demo03GenericIterfaceImpl a=new Demo03GenericIterfaceImpl(); a.method("dkmem");
/*含有泛型的接口第二种使用方式:接口使用什么泛型,实现类就使用什么泛型,类跟着接口走就相当于定义了一个含有泛型的类,创建对象的时候确定泛型的类型 public interface List<E>{ boolean add(E e); E get(int index); } public class ArrayList<E> implements list<E»{ public boolean add(E e) {} public E get(int index) {}*/ 使用: //第二中,创建Demo03GenericIterfaceImpl2对象,定义类型 Demo03GenericIteraceImpl2<Integer> b=new Demo03GenericIteraceImpl2<>(); b.method(55);
2.6泛型通配符
泛型通配符 当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。 但是一-旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。 通配符基本使用 泛型的通配符:**不知道使用什么类型来接收的时候,此时可以使用?表示未知通配符。 此时只能接受数据(作为参数传递),不能往该集合中存储数据 注:it.next()方法,取出的元素是onject,可以接收容易的数据类型 使用:定义一个方法,(不知道ArrayL ist集合使用什么数据类型,可以泛型的通配符?来接收数据类型) public static void printArray(ArrayList<?> list){}
泛型的高级应用
泛型的上限限定: ? extends E 泛型的下限限定: ? super E //泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类 public static void getElement1(Collection<? extends Number> coll){} //泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类 public static void getElement2(Collection<? super Number> coll){ } 类与类之间的继承关系 Integer extends Numben extends 0bject String extend sobject