java泛型
泛型
泛型:类型作为实参传给类或方法。
泛型声明:用一对尖括号<>声明。
标识符可以是任意字母表示确定类型。常用 T(type) E(element) K(key) V(value)
?通配符表示不确定类型,只有在运行时才知道其类型。
受限泛型:标识符受限泛型 和 ?通配符受限泛型
标识符受限泛型:<? extends Number> 问号是Number的扩展类型。 <? super Number> 问号是Number的父类。
?通配符受限泛型:<T extends Number>问号是Number的扩展类型。 <T super Number> 问号是Number的父类。
注释:Number子类有Integer、Double等。Number父类是Object。
泛型标识符实例
class Point<T>{ // 此处可以随便写标识符号,T是type的简称 
    private T var ; // var的类型由T指定,即:由外部指定  
    public T getVar(){  // 返回值的类型由外部决定  
        return var ;  
    }  
    public void setVar(T var){  // 设置的类型也由外部决定  
        this.var = var ;  
    }  
};  
public class GenericsDemo01{  
    public static void main(String args[]){  
        Point<String> p = new Point<String>() ; // 里面的var类型为String类型  
        p.setVar("it") ;        // 设置字符串  
        System.out.println(p.getVar().length()) ;   // 取得字符串的长度  
    }  
};
? 通配符实例
class Info<T>{ 
    private T var ;     // 定义泛型变量  
    public void setVar(T var){  
        this.var = var ;  
    }  
    public T getVar(){  
        return this.var ;  
    }  
    public String toString(){   // 直接打印  
        return this.var.toString() ;  
    }  
};  
public class GenericsDemo02{  
    public static void main(String args[]){  
        Info<String> i = new Info<String>() ;       // 使用String为泛型类型  
        i.setVar("it") ;                            // 设置内容  
        fun(i) ;  
    }  
    public static void fun(Info<?> temp){     // 可以接收任意的泛型对象  
        System.out.println("内容:" + temp) ;  
    }  
};
受限泛型
/***下界****/
class Info<T>{ 
    private T var ;     // 定义泛型变量  
    public void setVar(T var){  
        this.var = var ;  
    }  
    public T getVar(){  
        return this.var ;  
    }  
    public String toString(){   // 直接打印  
        return this.var.toString() ;  
    }  
};  
public class GenericsDemo03{  
    public static void main(String args[]){  
        Info<Integer> i1 = new Info<Integer>() ;        // 声明Integer的泛型对象  
        Info<Float> i2 = new Info<Float>() ;            // 声明Float的泛型对象  
        i1.setVar(30) ;                                 // 设置整数,自动装箱  
        i2.setVar(30.1f) ;                              // 设置小数,自动装箱  
        fun(i1) ;  
        fun(i2) ;  
    }  
    public static void fun(Info<? extends Number> temp){  // 只能接收Number及其Number的子类  
        System.out.print(temp + "、") ;  
    }  
};
/***上界****/
class Info<T>{ 
    private T var ;     // 定义泛型变量  
    public void setVar(T var){  
        this.var = var ;  
    }  
    public T getVar(){  
        return this.var ;  
    }  
    public String toString(){   // 直接打印  
        return this.var.toString() ;  
    }  
};  
public class GenericsDemo04{  
    public static void main(String args[]){  
        Info<String> i1 = new Info<String>() ;      // 声明String的泛型对象  
        Info<Object> i2 = new Info<Object>() ;      // 声明Object的泛型对象  
        i1.setVar("hello") ;  
        i2.setVar(new Object()) ;  
        fun(i1) ;  
        fun(i2) ;  
    }  
    public static void fun(Info<? super String> temp){    // 只能接收String或Object类型的泛型  
        System.out.print(temp + "、") ;  
    }  
}; 
泛形常见问题
使用泛形时,泛形类型须为引用类型,不能是基本数据类型
ArrayList<String> list = new ArrayList<Object>(); //错
ArrayList<Object> list = new ArrayList<String>(); //错
ArrayList<String> list = new ArrayList (); //行
ArrayList list = new ArrayList<String>(); //行
注:使用泛型
* 两边的类型必须一致
ArrayList<String> list = new ArrayList<String>();
* 两边只有一边用泛型(为了保持兼容性)
ArrayList<String> list = new ArrayList ();
ArrayList list = new ArrayList<String>();
感谢您的阅读,您的支持是我写博客动力。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号