JavaSe基础(25)-- 泛型

泛型

引子

    ArrayList al = new ArrayList ();

    al.add("abc"); 
    al.add("hahah");
    al.add(4); 

    Iterator it = al.iterator();
    while(it.hasNext()){

        String str = (String)it.next();
        System.out.println(str);
    }
  • 当调用某一类型自身特有的方法的时候就会出现异常

    .....
    while(it.hasNext()){
    
        String str = (String)it.next();
        System.out.println(str.toUpperCase());
     }
    
  • 那么怎么办,只有程序员主观控制。我们实际开发是面向接口的开发。

  • 那么,自己的程序,可以可以控制,可是,对方不知道你具体要什么数据啊。
  • 所以,在编译的时候是通过的,但是一运行就会出现异常。
  • 在jdk1.5提出了解决方案。怎么办呢?

    是不是应该在定义容器的时候,明确容器里面要放的数据类型。

    ArrayList<String> al = new ArrayList<String>();
    al.add("abc");//public boolean add(Object obj)
    al.add("hahah");
    //al.add(4);// 编译时会检测类型,提示错误。
    ...
    

概述

  • 泛型: jdk1.5出现的安全机制。约定了集合中元素的数据类型
  • 好处: 将运行时期的问题ClassCastException转到了编译时期。

常见符号

E         Elements   类或接口
T         Type       代表具有指定类型,并可以进行特有操作
K         Key
V         Value

?        Object     不进行特有操作的时候
  • 其实他们都是Object类型

泛型限定问题

  • 限制了类型的上界

    A  extends B   C extends B     B extends D   
    <? extends T>  表示限制了类型的上界,表示参数化类型的可能是T 或是 T的子类
    <? extends B>   ?  代表的是只能使用B或B的子类 ===B A  C 
    
  • 限制了类型的下界

    A  extends B    B extends C    D extends A
    <? super T>      表示限制了类型下界,表示参数化类型可能是T 或是 T父类,直至Object
    <? super A>    ? 代表的是只能使用A或A的父类  ==>A B  C          
    

你可能感兴趣的:(JavaSe基础(25)-- 泛型)