黑马程序员--泛型

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

泛型:
jdk1.5版本以后出现的一个安全机制。表现格式:< > 
好处: 
1:将运行时期的问题ClassCastException问题转换成了编译失败,体现在编译时期,程序员就可以解决

问题。 
2:避免了强制转换的麻烦。 
    只要带有<>的类或者接口,都属于带有类型参数的类或者接口,在使用这些类或者接口时,必须给
<>中传递一个具体的引用数据类型。
泛型技术:其实应用在编译时期,是给编译器使用的技术,到了运行时期,泛型就不存在了。 为什么?
 因为泛型的擦除:也就是说,编辑器检查了泛型的类型正确后,在生成的类文件中是没有泛型的。

在运行时,如何知道获取的元素类型而不用强转呢? 
泛型的补偿:因为存储的时候,类型已经确定了是同一个类型的元素,所以在运行时,只要获取到该元
素的类型,在内部进行一次转换即可,所以使用者不用再做转换动作了。
什么时候用泛型类呢? 
    当类中的操作的引用数据类型不确定的时候,以前用的Object来进行扩展的,现在可以用泛型来表
示。这样可以避免强转的麻烦,而且将运行问题转移到的编译时期。
泛型在程序定义上的体现: 
//泛型类:将泛型定义在类上。
class Tool {
private T obj; 
public  void setObject(T obj) {
this.obj = obj;

public T getObject() {
return obj;
}
}
//当方法操作的引用数据类型不确定的时候,可以将泛型定义在方法上。
public void method(W w) {
System.out.println("method:"+w);
}
//静态方法上的泛型:静态方法无法访问类上定义的泛型。如果静态方法操作的引用数据类型不确定的
时候,必须要将泛型定义在方法上。
public static void function(Q t) {
System.out.println("function:"+t);

//泛型接口 
interface Inter {
void show(T t);

class InterImpl implements Inter {
public void show(R r) { 
System.out.println("show:"+r);
}
}
泛型中的通配符:可以解决当具体类型不确定的时候,这个通配符就是 ?  ;当操作类型时,不需要使
用类型的具体功能时,只使用Object类中的功能。那么可以用 ? 通配符来表未知类型。
泛型限定: 
上限:?extends E:可以接收E类型或者E的子类型对象。
下限:?super E:可以接收E类型或者E的父类型对象。 
上限什么时候用:往集合中添加元素时,既可以添加E类型对象,又可以添加E的子类型对象。为什么?
因为取的时候,E类型既可以接收E类对象,又可以接收E的子类型对象。
下限什么时候用:当从集合中获取元素进行操作的时候,可以用当前元素的类型接收,也可以用当前元
素的父类型接收。
泛型的细节:
1)、泛型到底代表什么类型取决于调用者传入的类型,如果没传,默认是Object类型;
2)、使用带泛型的类创建对象时,等式两边指定的泛型必须一致;原因:编译器检查对象调用方法时
只看变量,然而程序运行期间调用方法时就要考虑对象具体类型了;
3)、等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容);要保证左右两边的泛型具体类型一致就可以了,这样不容易出错。

下面是一些代码:

 泛型无法向上转型

  1. class Info<T>{  
  2.     private T var ;     // 定义泛型变量  
  3.     public void setVar(T var){  
  4.         this.var = var ;  
  5.     }  
  6.     public T getVar(){  
  7.         return this.var ;  
  8.     }  
  9.     public String toString(){   // 直接打印  
  10.         return this.var.toString() ;  
  11.     }  
  12. };  
  13. public class GenericsDemo23{  
  14.     public static void main(String args[]){  
  15.         Info<String> i1 = new Info<String>() ;      // 泛型类型为String  
  16.         Info<Object> i2 = null ;  
  17.         i2 = i1 ;                               //这句会出错 incompatible types  
  18.     }  
  19. };  
 泛型数组

  1. public class GenericsDemo30{  
  2.     public static void main(String args[]){  
  3.         Integer i[] = fun1(1,2,3,4,5,6) ;   // 返回泛型数组  
  4.         fun2(i) ;  
  5.     }  
  6.     public static <T> T[] fun1(T...arg){  // 接收可变参数  
  7.         return arg ;            // 返回泛型数组  
  8.     }  
  9.     public static <T> void fun2(T param[]){   // 输出  
  10.         System.out.print("接收泛型数组:") ;  
  11.         for(T t:param){  
  12.             System.out.print(t + "、") ;  
  13.         }  
  14.     }  
  15. };  
泛型的嵌套设置

  1. class Info<T,V>{      // 接收两个泛型类型  
  2.     private T var ;  
  3.     private V value ;  
  4.     public Info(T var,V value){  
  5.         this.setVar(var) ;  
  6.         this.setValue(value) ;  
  7.     }  
  8.     public void setVar(T var){  
  9.         this.var = var ;  
  10.     }  
  11.     public void setValue(V value){  
  12.         this.value = value ;  
  13.     }  
  14.     public T getVar(){  
  15.         return this.var ;  
  16.     }  
  17.     public V getValue(){  
  18.         return this.value ;  
  19.     }  
  20. };  
  21. class Demo<S>{  
  22.     private S info ;  
  23.     public Demo(S info){  
  24.         this.setInfo(info) ;  
  25.     }  
  26.     public void setInfo(S info){  
  27.         this.info = info ;  
  28.     }  
  29.     public S getInfo(){  
  30.         return this.info ;  
  31.     }  
  32. };  
  33. public class GenericsDemo31{  
  34.     public static void main(String args[]){  
  35.         Demo<Info<String,Integer>> d = null ;       // 将Info作为Demo的泛型类型  
  36.         Info<String,Integer> i = null ;   // Info指定两个泛型类型  
  37.         i = new Info<String,Integer>("汤姆",30) ;    // 实例化Info对象  
  38.         d = new Demo<Info<String,Integer>>(i) ; // 在Demo类中设置Info类的对象  
  39.         System.out.println("内容一:" + d.getInfo().getVar()) ;  
  40.         System.out.println("内容二:" + d.getInfo().getValue()) ;  
  41.     }  
  42. };  


猜你喜欢

转载自blog.csdn.net/u014353343/article/details/40188969