• JAVA泛型【转】


      1 本文对Java泛型进行了全面的总结。文章内容包括普通泛型、通配符、受限泛型、泛型接口、泛型方法、返回泛型类型实例等等。
      2 AD: WOT2014课程推荐:实战MSA:用开源软件搭建微服务系统
      3 虽然Scala创始人Martin Odersky说当年正是因为Java泛型的丑陋,所以才想到要创建一个新的语言,不过这仍然不妨碍我们学习Java泛型。毕竟即使听说Java泛型不好用,但好不好用还是得会用了才知道。下面是一些有关Java泛型的总结:
      4 
      5 普通泛型
      6 
      7 class Point< T>{ // 此处可以随便写标识符号,T是type的简称 
      8 private T var ; // var的类型由T指定,即:由外部指定 
      9 public T getVar(){ // 返回值的类型由外部决定 
     10 return var ; 
     11  } 
     12  public void setVar(T var){ // 设置的类型也由外部决定 
     13 this.var = var ; 
     14  } 
     15 }; 
     16 public class GenericsDemo06{ 
     17  public static void main(String args[]){ 
     18  Point< String> p = new Point< String>() ; // 里面的var类型为String类型 
     19 p.setVar("it") ; // 设置字符串 
     20 System.out.println(p.getVar().length()) ; // 取得字符串的长度 
     21 } 
     22 }; 
     23 ----------------------------------------------------------
     24 
     25 class Notepad< K,V>{ // 此处指定了两个泛型类型 
     26 private K key ; // 此变量的类型由外部决定 
     27 private V value ; // 此变量的类型由外部决定 
     28 public K getKey(){ 
     29  return this.key ; 
     30  } 
     31  public V getValue(){ 
     32  return this.value ; 
     33  } 
     34  public void setKey(K key){ 
     35  this.key = key ; 
     36  } 
     37  public void setValue(V value){ 
     38  this.value = value ; 
     39  } 
     40 }; 
     41 public class GenericsDemo09{ 
     42  public static void main(String args[]){ 
     43  Notepad< String,Integer> t = null ; // 定义两个泛型类型的对象 
     44 t = new Notepad< String,Integer>() ; // 里面的key为String,value为Integer 
     45  t.setKey("汤姆") ; // 设置第一个内容 
     46 t.setValue(20) ; // 设置第二个内容 
     47 System.out.print("姓名;" + t.getKey()) ; // 取得信息 
     48 System.out.print(",年龄;" + t.getValue()) ; // 取得信息 
     49 
     50 } 
     51 }; 
     52 
     53 通配符
     54 
     55 class Info< T>{ 
     56  private T var ; // 定义泛型变量 
     57 public void setVar(T var){ 
     58  this.var = var ; 
     59  } 
     60  public T getVar(){ 
     61  return this.var ; 
     62  } 
     63  public String toString(){ // 直接打印 
     64 return this.var.toString() ; 
     65  } 
     66 }; 
     67 public class GenericsDemo14{ 
     68  public static void main(String args[]){ 
     69  Info< String> i = new Info< String>() ; // 使用String为泛型类型 
     70 i.setVar("it") ; // 设置内容 
     71 fun(i) ; 
     72  } 
     73  public static void fun(Info< ?> temp){ // 可以接收任意的泛型对象 
     74 System.out.println("内容:" + temp) ; 
     75  } 
     76 }; 
     77 
     78 受限泛型
     79 
     80 class Info< T>{ 
     81  private T var ; // 定义泛型变量 
     82 public void setVar(T var){ 
     83  this.var = var ; 
     84  } 
     85  public T getVar(){ 
     86  return this.var ; 
     87  } 
     88  public String toString(){ // 直接打印 
     89 return this.var.toString() ; 
     90  } 
     91 }; 
     92 public class GenericsDemo17{ 
     93  public static void main(String args[]){ 
     94  Info< Integer> i1 = new Info< Integer>() ; // 声明Integer的泛型对象 
     95 Info< Float> i2 = new Info< Float>() ; // 声明Float的泛型对象 
     96 i1.setVar(30) ; // 设置整数,自动装箱 
     97 i2.setVar(30.1f) ; // 设置小数,自动装箱 
     98 fun(i1) ; 
     99  fun(i2) ; 
    100  } 
    101  public static void fun(Info< ? extends Number> temp){ // 只能接收Number及其Number的子类 
    102 System.out.print(temp + "、") ; 
    103  } 
    104 }; 
    105 ----------------------------------------------------------
    106 
    107 
    108 class Info< T>{ 
    109  private T var ; // 定义泛型变量 
    110 public void setVar(T var){ 
    111  this.var = var ; 
    112  } 
    113  public T getVar(){ 
    114  return this.var ; 
    115  } 
    116  public String toString(){ // 直接打印 
    117 return this.var.toString() ; 
    118  } 
    119 }; 
    120 public class GenericsDemo21{ 
    121  public static void main(String args[]){ 
    122  Info< String> i1 = new Info< String>() ; // 声明String的泛型对象 
    123 Info< Object> i2 = new Info< Object>() ; // 声明Object的泛型对象 
    124 i1.setVar("hello") ; 
    125  i2.setVar(new Object()) ; 
    126  fun(i1) ; 
    127  fun(i2) ; 
    128  } 
    129  public static void fun(Info< ? super String> temp){ // 只能接收String或Object类型的泛型 
    130 System.out.print(temp + "、") ; 
    131  } 
    132 }; 
    133 
    134 Java泛型无法向上转型
    135 
    136 class Info< T>{ 
    137  private T var ; // 定义泛型变量 
    138 public void setVar(T var){ 
    139  this.var = var ; 
    140  } 
    141  public T getVar(){ 
    142  return this.var ; 
    143  } 
    144  public String toString(){ // 直接打印 
    145 return this.var.toString() ; 
    146  } 
    147 }; 
    148 public class GenericsDemo23{ 
    149  public static void main(String args[]){ 
    150  Info< String> i1 = new Info< String>() ; // 泛型类型为String 
    151  Info< Object> i2 = null ; 
    152  i2 = i1 ; //这句会出错 incompatible types 
    153  } 
    154 }; 
    155 
    156 Java泛型接口
    157 
    158 interface Info< T>{ // 在接口上定义泛型 
    159 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型 
    160 } 
    161 class InfoImpl< T> implements Info< T>{ // 定义泛型接口的子类 
    162 private T var ; // 定义属性 
    163 public InfoImpl(T var){ // 通过构造方法设置属性内容 
    164 this.setVar(var) ; 
    165  } 
    166  public void setVar(T var){ 
    167  this.var = var ; 
    168  } 
    169  public T getVar(){ 
    170  return this.var ; 
    171  } 
    172 }; 
    173 public class GenericsDemo24{ 
    174  public static void main(String arsg[]){ 
    175  Info< String> i = null; // 声明接口对象 
    176 i = new InfoImpl< String>("汤姆") ; // 通过子类实例化对象 
    177 System.out.println("内容:" + i.getVar()) ; 
    178  } 
    179 }; 
    180 ----------------------------------------------------------
    181 
    182 
    183 interface Info< T>{ // 在接口上定义泛型 
    184 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型 
    185 } 
    186 class InfoImpl implements Info< String>{ // 定义泛型接口的子类 
    187 private String var ; // 定义属性 
    188 public InfoImpl(String var){ // 通过构造方法设置属性内容 
    189 this.setVar(var) ; 
    190  } 
    191  public void setVar(String var){ 
    192  this.var = var ; 
    193  } 
    194  public String getVar(){ 
    195  return this.var ; 
    196  } 
    197 }; 
    198 public class GenericsDemo25{ 
    199  public static void main(String arsg[]){ 
    200  Info i = null; // 声明接口对象 
    201 i = new InfoImpl("汤姆") ; // 通过子类实例化对象 
    202 System.out.println("内容:" + i.getVar()) ; 
    203  } 
    204 }; 
    205 
    206 Java泛型方法
    207 
    208 class Demo{ 
    209  public < T> T fun(T t){ // 可以接收任意类型的数据 
    210 return t ; // 直接把参数返回 
    211 } 
    212 }; 
    213 public class GenericsDemo26{ 
    214  public static void main(String args[]){ 
    215  Demo d = new Demo() ; // 实例化Demo对象 
    216 String str = d.fun("汤姆") ; // 传递字符串 
    217 int i = d.fun(30) ; // 传递数字,自动装箱 
    218 System.out.println(str) ; // 输出内容 
    219 System.out.println(i) ; // 输出内容 
    220 } 
    221 }; 
    222 
    223 通过泛型方法返回泛型类型实例
    224 
    225 class Info< T extends Number>{ // 指定上限,只能是数字类型 
    226 private T var ; // 此类型由外部决定 
    227 public T getVar(){ 
    228  return this.var ; 
    229  } 
    230  public void setVar(T var){ 
    231  this.var = var ; 
    232  } 
    233  public String toString(){ // 覆写Object类中的toString()方法 
    234 return this.var.toString() ; 
    235  } 
    236 }; 
    237 public class GenericsDemo27{ 
    238  public static void main(String args[]){ 
    239  Info< Integer> i = fun(30) ; 
    240  System.out.println(i.getVar()) ; 
    241  } 
    242  public static < T extends Number> Info< T> fun(T param){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定 
    243 Info< T> temp = new Info< T>() ; // 根据传入的数据类型实例化Info 
    244  temp.setVar(param) ; // 将传递的内容设置到Info对象的var属性之中 
    245 return temp ; // 返回实例化对象 
    246 } 
    247 }; 
    248 
    249 使用泛型统一传入的参数类型
    250 
    251 class Info< T>{ // 指定上限,只能是数字类型 
    252 private T var ; // 此类型由外部决定 
    253 public T getVar(){ 
    254  return this.var ; 
    255  } 
    256  public void setVar(T var){ 
    257  this.var = var ; 
    258  } 
    259  public String toString(){ // 覆写Object类中的toString()方法 
    260 return this.var.toString() ; 
    261  } 
    262 }; 
    263 public class GenericsDemo28{ 
    264  public static void main(String args[]){ 
    265  Info< String> i1 = new Info< String>() ; 
    266  Info< String> i2 = new Info< String>() ; 
    267  i1.setVar("HELLO") ; // 设置内容 
    268 i2.setVar("汤姆") ; // 设置内容 
    269 add(i1,i2) ; 
    270  } 
    271  public static < T> void add(Info< T> i1,Info< T> i2){ 
    272  System.out.println(i1.getVar() + " " + i2.getVar()) ; 
    273  } 
    274 }; 
    275 
    276 Java泛型数组
    277 
    278 public class GenericsDemo30{ 
    279  public static void main(String args[]){ 
    280  Integer i[] = fun1(1,2,3,4,5,6) ; // 返回泛型数组 
    281 fun2(i) ; 
    282  } 
    283  public static < T> T[] fun1(T...arg){ // 接收可变参数 
    284 return arg ; // 返回泛型数组 
    285 } 
    286 public static < T> void fun2(T param[]){ // 输出 
    287 System.out.print("接收泛型数组:") ; 
    288 for(T t:param){ 
    289  System.out.print(t + "、") ; 
    290  } 
    291  } 
    292 }; 
    293 
    294 Java泛型的嵌套设置
    295 
    296 class Info< T,V>{ // 接收两个泛型类型 
    297 private T var ; 
    298  private V value ; 
    299  public Info(T var,V value){ 
    300  this.setVar(var) ; 
    301  this.setValue(value) ; 
    302  } 
    303  public void setVar(T var){ 
    304  this.var = var ; 
    305  } 
    306  public void setValue(V value){ 
    307  this.value = value ; 
    308  } 
    309  public T getVar(){ 
    310  return this.var ; 
    311  } 
    312  public V getValue(){ 
    313  return this.value ; 
    314  } 
    315 }; 
    316 class Demo< S>{ 
    317  private S info ; 
    318  public Demo(S info){ 
    319  this.setInfo(info) ; 
    320  } 
    321  public void setInfo(S info){ 
    322  this.info = info ; 
    323  } 
    324  public S getInfo(){ 
    325  return this.info ; 
    326  } 
    327 }; 
    328 public class GenericsDemo31{ 
    329  public static void main(String args[]){ 
    330  Demo< Info< String,Integer>> d = null ; // 将Info作为Demo的泛型类型 
    331 Info< String,Integer> i = null ; // Info指定两个泛型类型 
    332 i = new Info< String,Integer>("汤姆",30) ; // 实例化Info对象 
    333 d = new Demo< Info< String,Integer>>(i) ; // 在Demo类中设置Info类的对象 
    334 System.out.println("内容一:" + d.getInfo().getVar()) ; 
    335  System.out.println("内容二:" + d.getInfo().getValue()) ; 
    336  } 
    337 }; 

    转载于http://www.cnblogs.com/dk18stone/p/3738228.html

  • 相关阅读:
    ubuntu 16.0.5 修改网卡为固定IP
    Ubuntu PostgreSQL安装和配置
    NPOI 1.2.1版本替换为2.4.0版本实体类变更
    C# 之 Math取整
    解决github 下载过慢的问题
    优伦自动语言话务员设置
    python3学习笔记 列表
    【postgresql】role "root" does not exist 解决办法
    Eclipse使用的小技巧
    Servlet
  • 原文地址:https://www.cnblogs.com/paomoopt/p/3740588.html
Copyright © 2020-2023  润新知