五、泛型

泛型:
     jdk1.5出现的安全机制。
    
好处:
     1,将运行时期的问题ClassCastException转到了编译时期。
     2,避免了强制转换的麻烦。
 
类比:数组在创建时就明确了类型,表明数组中的元素只能是指定的类型。集合存的是对象,在jdk1.5之前没有对集合存储的对象进行限定,为了安全就出现了泛型。
    
<>:什么时候用?当操作的引用数据类型不确定的时候。就使用<>。将要操作的引用数据类型传入即可.
   其实<>就是一个用于接收具体引用数据类型的参数范围。
  
在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型 。

泛型技术是给编译器使用的技术,用于编译时期。确保了类型的安全。

运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。
为什么擦除呢?因为为了兼容运行的类加载器。

泛型的补偿:在运行时,通过获取元素的类型进行转换动作。不用使用者在强制转换了。


泛型的通配符:? 未知类型。

泛型的限定:
? extends E: 接收E类型或者E的子类型对象。上限
一般存储对象的时候用。比如 添加元素 addAll.

? super E: 接收E类型或者E的父类型对象。 下限。
一般取出对象的时候用。比如比较器。
 
1.泛型类
class Utils<T>
{
     private T obj;
 
     public void setObject(T obj)
     {
          this.obj = ;obj
     }
 
     public T getObject()
     {
          return obj;
     }
}
 
2.泛型方法
class Demo
{
     public <T> void show(T t)
     {
          System.out.println("show:" + t);
     }
 
     public <Q> void print(Q q)
     {
          System.out.println("print:" + q);
     }
}
 

 
class Demo<T>
{
     public void show(T t)
     {
          System.out.println("show:" + t);
     }
 
     public <Q> void print(Q q)
     {
          System.out.println("print:" + q);
     }
}
//此类中的show方法中的泛型跟随Demo类中的泛型
 

class Demo<T>
{
     public void show(T t)
     {
          System.out.println("show:" + t);
     }
 
     public <Q> void print(Q q)
     {
          System.out.println("print:" + q);
     }
 
     public static <W> void method(W w)
     {
          System.out.println("method:" + w);
     }
}
 
静态方法泛型:静态方法不可以访问类上定义的泛型。如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上(格式要正确)。
 
3.泛型接口
interface Inter<T>
{
     void show(T t);
}

/*
class InterImpl implements Inter<String>
{
     public void show(String t)
     {
          System.out.println("show :"+t);
     }
}
*/

class InterImpl<T> implements Inter<T>
{
     public void show(T t)
     {
          System.out.println("show :"+t);
     }
}
原文地址:https://www.cnblogs.com/lzxl/p/4312902.html