泛型知识总结

 

 

 

两个概念:

 

          T类型形参

 

         String是实际类型参数

 

    

 

并不存在泛型类

 

    我们所说的泛型类是逻辑上的,物理上是不存在,

 

 

 

    List a  = new ArrayList ();
    List b  = new ArrayList ();
    System.out.print(a.getClass() == b.getClass());//打印的结果是 "true"

 

 

 

 

因为List 和 List是同种类,他们在内存中是占用同一块内存,

 

所有静态域,静态方法,静态初始化块,是不允许使用泛型的。

 

  

 

       static T info;
     public static T getCount(){}
    //以上两个都是错误的,静态XX是不允许使用泛型,因为他们是使用一块内存的,作为类变量和类方法是共享的,所以不能因T的改变而改变,故使用泛型编程是不合法的。

 

 

 

 

 

从泛型类派生子类

 

不能带类型形参。只能带实际类型参数。
注意:
    String 是 Object的子类。
    但是  List  不是 List的子类。
 
数组和泛型
数组的父类只能是数组或者Object
有类 A B 
B extends A
B[]  不是 A或者B的子类
B[]  是A[]的子类 也是Object的子类
 
类型通配符 "?"
    利用类型通配符目的是来表示泛型的父类 
    例如: List  是List(T是任何类型)  的父类。  "?"是可以匹配任何类型的。
    List 只是用来表示父类,List a   a.add(new Object()); 这个是不合法的,因为根本就不知道a 里面是什么类型,所以不能进行add操作。
 
 
设定通配符的上限  List
    List   缩小了? 的范围   只能是shaps本身,或者是shaps的派生子类。
public void   do (List shaps){
        Shaps myShaps =(Shaps) shaps.get(0);//要进行类型转换,比较繁琐
        myShaps.paint();//调用shaps的一个方法;
    }
    
     public void   do (Listextends Shaps> shaps){
         shaps.get(0).paint();//不用进行强制类型转换,利用多态,shaps 是Shaps 或者Shaps子类实例,都可以不用强制类型转换就可以调用paint()方法。           
    }
 
    注意:同 "?"一样  "List " a.add(new Shaps());  也是不合法的,因为不能准确知道子类类型。
     总之:使用 通配符"?" 类型就是未知,所以不能add进去
 
设定类型形参的上限  List
 List
还可以这样子,用&实现多个限制,

 

 

 

 

 

 

你可能感兴趣的:(Java,java)