• 5 Java学习之 泛型


    1. 基本概念

             泛型是Java SE 1.5的新特性,泛型的本质是 参数化类型 ,也就是说所操作的 数据类型 被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为 泛型类 、泛型接口、泛型方法。
        好处:
    • 泛型的主要目标是提高 Java 程序的类型安全。
    • 消除强制类型转换。

    2. 示例

      2.1 普通泛型

    Java代码 
    1. class Point<T>{       // 此处可以随便写标识符号,T是type的简称  
    2.     private T var ; // var的类型由T指定,即:由外部指定  
    3.     public T getVar(){  // 返回值的类型由外部决定  
    4.         return var ;  
    5.     }  
    6.     public void setVar(T var){  // 设置的类型也由外部决定  
    7.         this.var = var ;  
    8.     }  
    9. };  
    10. public class GenericsDemo06{  
    11.     public static void main(String args[]){  
    12.         Point<String> p = new Point<String>() ; // 里面的var类型为String类型  
    13.         p.setVar("it") ;        // 设置字符串  
    14.         System.out.println(p.getVar().length()) ;   // 取得字符串的长度  
    15.     }  
    16. };  
    17. ----------------------------------------------------------  
    18. class Notepad<K,V>{       // 此处指定了两个泛型类型  
    19.     private K key ;     // 此变量的类型由外部决定  
    20.     private V value ;   // 此变量的类型由外部决定  
    21.     public K getKey(){  
    22.         return this.key ;  
    23.     }  
    24.     public V getValue(){  
    25.         return this.value ;  
    26.     }  
    27.     public void setKey(K key){  
    28.         this.key = key ;  
    29.     }  
    30.     public void setValue(V value){  
    31.         this.value = value ;  
    32.     }  
    33. };  
    34. public class GenericsDemo09{  
    35.     public static void main(String args[]){  
    36.         Notepad<String,Integer> t = null ;        // 定义两个泛型类型的对象  
    37.         t = new Notepad<String,Integer>() ;       // 里面的key为String,value为Integer  
    38.         t.setKey("汤姆") ;        // 设置第一个内容  
    39.         t.setValue(20) ;            // 设置第二个内容  
    40.         System.out.print("姓名;" + t.getKey()) ;      // 取得信息  
    41.         System.out.print(",年龄;" + t.getValue()) ;       // 取得信息  
    42.   
    43.     }  
    44. };  

     通配符

    Java代码 
    1. class Info<T>{  
    2.     private T var ;     // 定义泛型变量  
    3.     public void setVar(T var){  
    4.         this.var = var ;  
    5.     }  
    6.     public T getVar(){  
    7.         return this.var ;  
    8.     }  
    9.     public String toString(){   // 直接打印  
    10.         return this.var.toString() ;  
    11.     }  
    12. };  
    13. public class GenericsDemo14{  
    14.     public static void main(String args[]){  
    15.         Info<String> i = new Info<String>() ;       // 使用String为泛型类型  
    16.         i.setVar("it") ;                            // 设置内容  
    17.         fun(i) ;  
    18.     }  
    19.     public static void fun(Info<?> temp){     // 可以接收任意的泛型对象  
    20.         System.out.println("内容:" + temp) ;  
    21.     }  
    22. };  

     2.2受限泛型

    Java代码 
    1. class Info<T>{  
    2.     private T var ;     // 定义泛型变量  
    3.     public void setVar(T var){  
    4.         this.var = var ;  
    5.     }  
    6.     public T getVar(){  
    7.         return this.var ;  
    8.     }  
    9.     public String toString(){   // 直接打印  
    10.         return this.var.toString() ;  
    11.     }  
    12. };  
    13. public class GenericsDemo17{  
    14.     public static void main(String args[]){  
    15.         Info<Integer> i1 = new Info<Integer>() ;        // 声明Integer的泛型对象  
    16.         Info<Float> i2 = new Info<Float>() ;            // 声明Float的泛型对象  
    17.         i1.setVar(30) ;                                 // 设置整数,自动装箱  
    18.         i2.setVar(30.1f) ;                              // 设置小数,自动装箱  
    19.         fun(i1) ;  
    20.         fun(i2) ;  
    21.     }  
    22.     public static void fun(Info<? extends Number> temp){  // 只能接收Number及其Number的子类  
    23.         System.out.print(temp + "、") ;  
    24.     }  
    25. };  
    26. ----------------------------------------------------------  
    27. class Info<T>{  
    28.     private T var ;     // 定义泛型变量  
    29.     public void setVar(T var){  
    30.         this.var = var ;  
    31.     }  
    32.     public T getVar(){  
    33.         return this.var ;  
    34.     }  
    35.     public String toString(){   // 直接打印  
    36.         return this.var.toString() ;  
    37.     }  
    38. };  
    39. public class GenericsDemo21{  
    40.     public static void main(String args[]){  
    41.         Info<String> i1 = new Info<String>() ;      // 声明String的泛型对象  
    42.         Info<Object> i2 = new Info<Object>() ;      // 声明Object的泛型对象  
    43.         i1.setVar("hello") ;  
    44.         i2.setVar(new Object()) ;  
    45.         fun(i1) ;  
    46.         fun(i2) ;  
    47.     }  
    48.     public static void fun(Info<? super String> temp){    // 只能接收String或Object类型的泛型  
    49.         System.out.print(temp + "、") ;  
    50.     }  
    51. };  

     泛型无法向上转型

    Java代码 
    1. class Info<T>{  
    2.     private T var ;     // 定义泛型变量  
    3.     public void setVar(T var){  
    4.         this.var = var ;  
    5.     }  
    6.     public T getVar(){  
    7.         return this.var ;  
    8.     }  
    9.     public String toString(){   // 直接打印  
    10.         return this.var.toString() ;  
    11.     }  
    12. };  
    13. public class GenericsDemo23{  
    14.     public static void main(String args[]){  
    15.         Info<String> i1 = new Info<String>() ;      // 泛型类型为String  
    16.         Info<Object> i2 = null ;  
    17.         i2 = i1 ;                               //这句会出错 incompatible types  
    18.     }  
    19. };  

     2.3泛型接口

    Java代码 
    1. interface Info<T>{        // 在接口上定义泛型  
    2.     public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型  
    3. }  
    4. class InfoImpl<T> implements Info<T>{   // 定义泛型接口的子类  
    5.     private T var ;             // 定义属性  
    6.     public InfoImpl(T var){     // 通过构造方法设置属性内容  
    7.         this.setVar(var) ;    
    8.     }  
    9.     public void setVar(T var){  
    10.         this.var = var ;  
    11.     }  
    12.     public T getVar(){  
    13.         return this.var ;  
    14.     }  
    15. };  
    16. public class GenericsDemo24{  
    17.     public static void main(String arsg[]){  
    18.         Info<String> i = null;        // 声明接口对象  
    19.         i = new InfoImpl<String>("汤姆") ;  // 通过子类实例化对象  
    20.         System.out.println("内容:" + i.getVar()) ;  
    21.     }  
    22. };  
    23. ----------------------------------------------------------  
    24. interface Info<T>{        // 在接口上定义泛型  
    25.     public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型  
    26. }  
    27. class InfoImpl implements Info<String>{   // 定义泛型接口的子类  
    28.     private String var ;                // 定义属性  
    29.     public InfoImpl(String var){        // 通过构造方法设置属性内容  
    30.         this.setVar(var) ;    
    31.     }  
    32.     public void setVar(String var){  
    33.         this.var = var ;  
    34.     }  
    35.     public String getVar(){  
    36.         return this.var ;  
    37.     }  
    38. };  
    39. public class GenericsDemo25{  
    40.     public static void main(String arsg[]){  
    41.         Info i = null;      // 声明接口对象  
    42.         i = new InfoImpl("汤姆") ;    // 通过子类实例化对象  
    43.         System.out.println("内容:" + i.getVar()) ;  
    44.     }  
    45. };  

     2.4泛型方法

    Java代码 
    1. class Demo{  
    2.     public <T> T fun(T t){            // 可以接收任意类型的数据  
    3.         return t ;                  // 直接把参数返回  
    4.     }  
    5. };  
    6. public class GenericsDemo26{  
    7.     public static void main(String args[]){  
    8.         Demo d = new Demo() ;   // 实例化Demo对象  
    9.         String str = d.fun("汤姆") ; //   传递字符串  
    10.         int i = d.fun(30) ;     // 传递数字,自动装箱  
    11.         System.out.println(str) ;   // 输出内容  
    12.         System.out.println(i) ;     // 输出内容  
    13.     }  
    14. };  

     通过泛型方法返回泛型类型实例

    Java代码 
    1. class Info<T extends Number>{ // 指定上限,只能是数字类型  
    2.     private T var ;     // 此类型由外部决定  
    3.     public T getVar(){  
    4.         return this.var ;     
    5.     }  
    6.     public void setVar(T var){  
    7.         this.var = var ;  
    8.     }  
    9.     public String toString(){       // 覆写Object类中的toString()方法  
    10.         return this.var.toString() ;      
    11.     }  
    12. };  
    13. public class GenericsDemo27{  
    14.     public static void main(String args[]){  
    15.         Info<Integer> i = fun(30) ;  
    16.         System.out.println(i.getVar()) ;  
    17.     }  
    18.     public static <T extends Number> Info<T> fun(T param){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定  
    19.         Info<T> temp = new Info<T>() ;      // 根据传入的数据类型实例化Info  
    20.         temp.setVar(param) ;        // 将传递的内容设置到Info对象的var属性之中  
    21.         return temp ;   // 返回实例化对象  
    22.     }  
    23. };  

     使用泛型统一传入的参数类型

    Java代码 
    1. class Info<T>{    // 指定上限,只能是数字类型  
    2.     private T var ;     // 此类型由外部决定  
    3.     public T getVar(){  
    4.         return this.var ;     
    5.     }  
    6.     public void setVar(T var){  
    7.         this.var = var ;  
    8.     }  
    9.     public String toString(){       // 覆写Object类中的toString()方法  
    10.         return this.var.toString() ;      
    11.     }  
    12. };  
    13. public class GenericsDemo28{  
    14.     public static void main(String args[]){  
    15.         Info<String> i1 = new Info<String>() ;  
    16.         Info<String> i2 = new Info<String>() ;  
    17.         i1.setVar("HELLO") ;        // 设置内容  
    18.         i2.setVar("汤姆") ;       // 设置内容  
    19.         add(i1,i2) ;  
    20.     }  
    21.     public static <T> void add(Info<T> i1,Info<T> i2){  
    22.         System.out.println(i1.getVar() + " " + i2.getVar()) ;  
    23.     }  
    24. };  

     2.5 泛型数组

    Java代码 
    1. public class GenericsDemo30{  
    2.     public static void main(String args[]){  
    3.         Integer i[] = fun1(1,2,3,4,5,6) ;   // 返回泛型数组  
    4.         fun2(i) ;  
    5.     }  
    6.     public static <T> T[] fun1(T...arg){  // 接收可变参数  
    7.         return arg ;            // 返回泛型数组  
    8.     }  
    9.     public static <T> void fun2(T param[]){   // 输出  
    10.         System.out.print("接收泛型数组:") ;  
    11.         for(T t:param){  
    12.             System.out.print(t + "、") ;  
    13.         }  
    14.     }  
    15. };  

     泛型的嵌套设置

    Java代码 
    1. class Info<T,V>{      // 接收两个泛型类型  
    2.     private T var ;  
    3.     private V value ;  
    4.     public Info(T var,V value){  
    5.         this.setVar(var) ;  
    6.         this.setValue(value) ;  
    7.     }  
    8.     public void setVar(T var){  
    9.         this.var = var ;  
    10.     }  
    11.     public void setValue(V value){  
    12.         this.value = value ;  
    13.     }  
    14.     public T getVar(){  
    15.         return this.var ;  
    16.     }  
    17.     public V getValue(){  
    18.         return this.value ;  
    19.     }  
    20. };  
    21. class Demo<S>{  
    22.     private S info ;  
    23.     public Demo(S info){  
    24.         this.setInfo(info) ;  
    25.     }  
    26.     public void setInfo(S info){  
    27.         this.info = info ;  
    28.     }  
    29.     public S getInfo(){  
    30.         return this.info ;  
    31.     }  
    32. };  
    33. public class GenericsDemo31{  
    34.     public static void main(String args[]){  
    35.         Demo<Info<String,Integer>> d = null ;       // 将Info作为Demo的泛型类型  
    36.         Info<String,Integer> i = null ;   // Info指定两个泛型类型  
    37.         i = new Info<String,Integer>("汤姆",30) ;    // 实例化Info对象  
    38.         d = new Demo<Info<String,Integer>>(i) ; // 在Demo类中设置Info类的对象  
    39.         System.out.println("内容一:" + d.getInfo().getVar()) ;  
    40.         System.out.println("内容二:" + d.getInfo().getValue()) ;  
    41.     }  
    42. };  

  • 相关阅读:
    快速排序模板
    C++面试题目汇总
    二叉树两个节点的最大路径
    vim中操作的快捷键
    剑指offer 顺时针打印矩阵
    剑指offer 判断一棵树是不是另一棵树的子结构
    poi导出excel表
    java 获取服务器(ftp)指定文件夹内的文件
    部署web应用
    tomcat 的目录结构及修改端口号
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3225749.html
Copyright © 2020-2023  润新知