黑马程序员技术交流社区

标题: 集合 上的补充 [打印本页]

作者: 柒月份的尾巴丶    时间: 2016-7-30 00:22
标题: 集合 上的补充
4.泛型:
   a.泛型的优点:
     1.使用泛型可以避免强转麻烦
     2.不使用泛型在运行时防止出现类型转换异常(ClassCastException)

   b.泛型使用位置:
     1.在类上使用:当创建这个类的对象时候,确定泛型的实际类型
       class Test<E,....>{//...代表泛型可以有多个,用,隔开
        private E e;      //类上定义在泛型可以在类中使用(变量和方法)
        public E method(E e){
           return null;
        }


       }
      Test<String>=new  Test<String>();//E的类型被确定为String,所有用到E的地方都是String类型
    2.在方法上使用:当调用method()方法时,传入什么类型T就是什么类型
       class Test{//...代表泛型可以有多个,用,隔开
        
         public <T> void method(T t){ //在方法返回值前面定义泛型,然后才能使用(形参,返回值,方法内部)


         }

       }
    3.再接口上定义泛型:
      interface Father<T>{
              void method(T t);
      }
      class Son implements Father<String>{//在实现父接口时直接确定泛型的类型,那么方法中用到的接口上的泛型也被确定
               public void method(String t){

               }
      }
      class Son2<T> implements Father<T>{//在实现父接口时不能直接确定泛型的类型,在创建Son2()的对象确定T的类型

         void method(T t){

         }

      }
      Son2<String>son=new Son2<String>();
    4.泛型通配符: ?
      ? extends E : ?的类型是E类型或E的子类型
      ? super E:?为E类型或者E的父类型
      
      public class Demo04<T> {

              public static void main(String[] args) {
                     
             Collection<String> c = new ArrayList<String>();
                   c.add("baby");
                       c.add("柳岩");
                       c.add("林允");
                     
                      ArrayList<CharSequence> list = new ArrayList<CharSequence>(c);//ArrayList(Collection<? extends E> c)
                                                                                                                                 //在new ArrayList<CharSequence>()确定了E的类型为
                                                                                   //E的类型为CharSequence
                                                                                   //ArrayList(Collection<? extends CharSequence> c)
                                                                                  // 把new ArrayList<String>(); 传递给ArrayList的构造函数


                      System.out.println(list);
                                                                                 
                      Demo04<Son> demo=new Demo04<Son>();//public void method(ArrayList<? super T> al)的T被确定为Son
                      ArrayList<Father> al=new ArrayList<Father>();
                  demo.method(al);//new ArrayList<Father>() 传给 method(ArrayList<? super Son> al)
                                  //Father代替?
                                  //Father super Son,Father是Son的父类型OK 没问题
                     
              }               
              public void method(ArrayList<? super Son> al){
                                                            
              }
      }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2