java泛型知识:
泛型同注解一样,也分为定义和使用,比如JDK中集合框架对泛型进行了定义,而我们使用集合框架
时,就直接遵循定义进行了使用。
泛型的定义:
   1、在类中进行定义
     

public class T4<E> {
  private E e; 
  public void setE(E e){
   this.e=e;
  } 
  public E getE(){
   return this.e;
  }
      }


     也就是如以上的形式,在定义类的时候,定义该类中可能需要的泛型类
   2、在方法上定义:
   

public class TT{
  public <E> void test(E e){
   
  }
      }


   3、定义泛型时加上该泛型的约束,默认的泛型实际上是表示继承Object类,可以在
    定义时指定需要继承的类或实现的接口:
   

class TTT<E extends Map>{
  
     }


    这样在使用TTT的泛型时,该泛型必须实现Map接口。

  两种定义方式的不同,也就是该泛型的使用范围不同,在类上定义的泛型,则在整个类中都可
  使用;在方法上定义的泛型,只能在该方法中使用。
  定义泛型时,不能在定义的类中实例化该泛型,例如,下面的用法就是错的:

class TTT<E>{
  public void test(){
   E e=new E();
  }
   }


  编译器会提示“不能实例化类型 E”,这个的具体原因我不清楚,如果一定要实例化该泛型,
  可以采取强制转换的方式,例如:
 

class TTT<E>{
  public void test(){
   E e=(E)new Object();
  }
   }


  这个应该容易理解,因为没有显示指明类型,默认就是Object的子类。

  泛型的使用:
  使用泛型就比较容易了,记得当初学java集合框架的时候,很容易就理解了如何使用加上了
  泛型的集合框架。不过作为知识的完备性,有一点还是要说一下,就是在使用泛型时,可以
  使用这种语法来定义一个泛型引用:
 

public static void main(String[] args) {  
   T4<? extends List> tt=null;
   tt=new T4<ArrayList>();
   tt=new T4<LinkedList>();
   }


  这样就可以让tt这个引用指向任何实现了List接口的泛型类。不过这样做个人认为不是很合适,
  本身泛型在使用时就是为了指明具体的类型,用这种方式使用,反而又模糊了使用的具体类型,
  如果使用set(E)时,编译器会报错,因为它不知道具体要把一个什么类型set进去。

  也就是说定义泛型时应当越抽象越好,而使用泛型时,则应越具体越好。

  对泛型的总结:
  泛型编程就是对处理的数据进行抽象,使得处理的算法具有普适性,也算是比较高级的编程了。
  对泛型的定义,我还没有在开发中实践过,以后有了实践经验,再来总结。