黑马程序员_泛型

来源:互联网 发布:博客编辑软件 编辑:程序博客网 时间:2024/06/10 10:55

------- android培训、java培训、期待与您交流! ----------

 

泛型:
    它是jdk1.5版本,出现的技术,是一个安全机制。
   泛型技术的由来:
     集合中可以存储任意类型对象,但是在取出时,如果要使用具体对象的特有方法时,需要进行向下转型,
     如果存储的对象类型不一致,在转型过程中就会出现ClassCastException异常。
   在jdk1.5以后就有了解决方案,就是泛型技术。
   解决方案就是,在存储元素时,就不允许存储不同类型的元素。
   存储了就编译失败。
   
   所以就需要在存储元素时,在容器上明确具体的元素类型,这其实就和数组定义很像。
   
   好处:
    1,将运行时期的classcastException异常转移到了编译时期,进行检查,并以编译失败来体现。
    这样有利于程序员尽早解决问题。
    2,避免了向下转型(强转的)麻烦。
    
    
   什么时候写泛型呢?
   
    先简单理解:只要在使用类或者接口时,该类或者接口在api文档描述时都带着<>就需要在使用时,定义泛型。
    其实:泛型无非就是通过<>定义了一个形式参数,专门用于接收具体的引用类型。
    在使用时,一定要传递对应的实际参数类型。
    集合中泛型的应用特别多见。
   
   没有使用特有方法的不需要强转的,正因为要使用特有方法所以就要加泛型。
   
   泛型的擦除:
     泛型技术是用于编译时期的技术,这个技术是编译器里面融合进来了,生成后的class文件是不带泛型的。编译器会按照<>
     中的指定的类型对元素进行检查,检查不匹配,就编译失败,匹配,就编译通过,通过后生产的class文件中是没有泛型的。
   泛型的补偿:
     运行时,可以根据具体的元素对象获取其具体的类型,并用该类型对元素进行自动转换。
     
  泛型对于程序的设计也有一定优化动作。
  当一个类要操作的引用数据类型不确定的时候,可以将该类型定义一个形参。
  用到的这类时,有使用者来通过传递类型参数的形式,来确定要操作的具体的、
  对象类型。
  意味着:在定义这个类时候,需要在类上定义形参,用于接收具体的类型实参。   
  这就是泛型定义在类上, 这就是泛型类。
  
  什么时候使用泛型类呢?只要类中操作的引用数据类型不确定的时候,就可以定义泛型类。
  
  有了泛型类,省去了曾经的强转和类型转换异常的麻烦。
  
  
  泛型除了 可以定义在类上 也可以定义在方法上。
  
  定义方法的是 在public加泛型。
   静态方法不可以访问类上定义的泛型,如果需要泛型,该泛型只能定义在方法上。 静态的泛型定义在返回值前面,类型的后面。  
  泛型也可以定义在接口上,只要类型不确定都可以写泛型。
  
   实现接口时,明确具体的类型。
   实现接口时候,也不明确具体的类型。  
通配符的应用: 
  集合中使用的注意特点:保证两边一致。简单的定义方式就是保证两边类型一致,但是也有其他情况。
  泛型的通配符:?  类型不匹配时候用。当操作不同容器中类型都不确定的时候,而且使用的都是元素的从Object类中继承的方法。
  这时泛型就用通配符?来表示即可。

泛型的限定:
  明确具体类型代表一个类型,明确?代表所有类型,
  能不能对操作的类型限制在一个范围之内呢?
  
  比如:定义一个功能,只操作person类或者person子类型。这时可以用?继承 E接收e类型或者E的子类型。
  存储时候就用这种方式。这就是上限。
  下限的表示形式: ? super E;接受E类型或者E的父类型。
      
 什么时候使用上限呢? 一般情况下,只要是往容器中添加元素时,使用上限 ? extends  E
 什么时候使用下限呢?一般情况下,只要是从容器中取出元素时,使用下限 ? super E