目录

1.使用场景:

2.使用泛型的好处:

3. 注意点:

4.通配符:?

1.使用场景:

集合容器类 在设计阶段/声明阶段 不能确定实际存的是什么类型的对象

把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection<E>,List<E>,ArrayList<E> 这个<E>就是类型参数,即泛型。

2.使用泛型的好处:

  1. 只有指定的数据类型才能添加到集合中:编译时,就会进行类型检查,保证数据类型安全
            Map<String,Integer> map = new HashMap<>();  //jdk7之后可以类型推断 
  2. 避免了强转操作,强转时,可能出现ClassCastException
1.         遍历方式:方式一: for(Integer score : list){   }
                         方式二:Iterator<Integer> iterator = list.iterator();
                                       while(iterator.hasNext()){
                                                  int stuScore = iterator.next();
                                                  System.out.println(stuScore);
                                           }

3. 注意点:

  1. 集合接口或集合类  为带泛型的结构    (jdk5.0及以后)
  2. 泛型类可以有多个参数<E1,E2,E3>
  3. 泛型的类型必须是类,基本数据类型可用包装类
  4. 实例化集合类时,确定具体的泛型类型。且内部结构所用之处皆为实例化后的泛型类型
  5. 泛型 默认类型为java.lang.Object类型。
  6. 实例化子类对象时,不再需要指明泛型。泛型子类继承了父类的泛型类型
  7. 泛型方法在调用时,指明泛型参数的类型。泛型方法,可以声明为静态的
  8. 静态方法中不能使用类的泛型(在类、接口上声明的泛型)
1.  //    public static void show(T orderT){  //错误的
 //        System.out.println(orderT);
 //    }
  1. 泛型不同的引用(引用数据类型)不能相互赋值。
  2. 泛型在继承方面的体现:  类A是类B的父类:
9.          G<A> 和G<B>二者不具备子父类关系,二者是并列关系。
         A<G> 是 B<G> 的父类   子类引用可以赋值给父类

4.通配符:?

4.1 G<A>和G<B>是并列关系,二者共同的父类是:G<?>

4.2  List<?>  添加读取

  1. 不能向其内部添加数据即list.add()(除了null可以),只能引用赋值(list = list1)
  2. 允许读取数据,读取的数据类型为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及以上都可以

读取的数据类型为 包含范围较大的数据类型  即最高父类,否则编译不通过