黑马程序员-6 泛型

 

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。

在泛型出现前,让类直接持有Object类型的对象来实现泛用。

泛型基本是现在编译器层次上。

class Point<T>{       // 此处可以随便写标识符号,T是type的简称  
    private T var ; // var的类型由T指定,即:由外部指定  
    public T getVar(){  // 返回值的类型由外部决定  
        return var ;  
    }  
    public void setVar(T var){  // 设置的类型也由外部决定  
        this.var = var ;  
    }  
};  
public class GenericsDemo06{  
    public static void main(String args[]){  
        Point<String> p = new Point<String>() ; // 里面的var类型为String类型  
        p.setVar("it") ;        // 设置字符串  
        System.out.println(p.getVar().length()) ;   // 取得字符串的长度  
    }  
};  

 

 

泛型方法:
尽可能使用泛型方法:如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法。
static方法无法访问泛型类的类型参数,所以如果static需要使用泛型,必须使其成为泛型方法。

class Demo{  
    public <T> T fun(T t){            // 可以接收任意类型的数据  
        return t ;                  // 直接把参数返回  
    }  
};  
public class GenericsDemo26{  
    public static void main(String args[]){  
        Demo d = new Demo() ;   // 实例化Demo对象  
        String str = d.fun("汤姆") ; //   传递字符串  
        int i = d.fun(30) ;     // 传递数字,自动装箱  
        System.out.println(str) ;   // 输出内容  
        System.out.println(i) ;     // 输出内容  
    }  
}; 

 

泛型的通配符:? 未知类型
可以对类型进行限定 ? extends E:接收E类型或者子类型对象,上限
? super E:接收E类型或者E的福类型,下限
一般来说,在存储元素的时候使用上限,因为这样都是按照上限类型来运算的,不会出现类型安全隐患。

class MyCollection<E>{  
    public void add(E e){  
    }  
    public void addAll(MyCollection<? extends E> al){           
    }  
} 

 


什么时候使用下限?通常对集合中的元素进行取出操作时,可以使用下限。

class TreeSet<E>
{
     Tree(Comparator<? super E> comp);
}

 

====================================================
泛型无法向上转型

class Info<T>{  
    private T var ;     // 定义泛型变量  
    public void setVar(T var){  
        this.var = var ;  
    }  
    public T getVar(){  
        return this.var ;  
    }  
    public String toString(){   // 直接打印  
        return this.var.toString() ;  
    }  
};  
public class GenericsDemo23{  
    public static void main(String args[]){  
        Info<String> i1 = new Info<String>() ;      // 泛型类型为String  
        Info<Object> i2 = null ;  
        i2 = i1 ;                               //这句会出错 incompatible types  
    }  
};  

 

posted @ 2012-10-20 13:46  EnderViking  阅读(126)  评论(0编辑  收藏  举报