新手教程!Java泛型理解起来超容易

发表于:2021-6-11 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:布小禅    来源:CSDN

  泛型!
  当我第一次听到这个东西的时候,我是这样想的:
  泛型?什么东西,听起来感觉挺高大上的,我能学会吗?我能理解吗?我会不会栽在这里?
  是啊,听起来就蛮牛,蛮高大上的嘛,但是你需要仔细理解,啊不对,说得简单点,你就把这俩字拆开来解读不就完事了吗?
  泛型:
  泛:广泛
  型:类型
  对,其实就是这样,是不是瞬间感觉。
  好嘛,这才哪跟哪啊,你要是这样想,就对了!哈哈,不要觉的他好难好难的。
  理解最重要,我一向反对死记硬背的学习,所以我也不抄别人的看着好高大上的解释,除了让人望而生畏之外,对理解并没有什么卵用。
  像他们说的什么参数化类型,那玩意真的能让很多人理解吗?
  并不能,至少在我看到这个的时候,是无法很清晰的理解到的,既然我做不到,那么根据某定理(想不起来名字了),那么肯定也有人和我一样,无法很明白的,很清晰的理解这个东西。
  那我就按照我的理解来说了!
  1. 认识Java中的泛型使用
  那么我们先来看看这个代码:
  ArrayListb = new ArrayList<>();
  之前说过,哪个小小的尖括号里面是放类型的,可以是任意的引用类型
  何为引用类型:字符串,数组,接口,类。。。
  那么我需要整型的怎么办,之前也说过,装箱,装箱为Integer这种类型的就可以了
  好,言归正传,这个代码我们很熟悉,创建一个ArrayList集合对象嘛,形式我们也很熟悉,类的实例化对象嘛。
  但是你有没有发现,这个格式貌似和我们自己定义的类的实例化对象的格式不太一样?
  那么再来看看我们之前创建的Girl类的实例化
  Girl girl = new Girl();
  大致一看,还是差不多的:
  类名 自定义名字 = new 类名;
  但是仔细一看就不一样了,尖括号,对,我们创建的Girl中没有尖括号。
  那么这个尖括号是干嘛的呢?联想我们的这个博客,你是不是若有所思?难不成,这就是泛型?
  对啊,这就是泛型啊,这就是Java中的具体使用,用来广泛特指别的类型
  说到这里,有没有一种恍然大悟的感觉
  2. 泛型特性
  泛型类型在逻辑上看成是多个不同的类型,实际上都是相同的基本类型
  3. 泛型使用
  相信经过上面的解释,你已经对泛型有所理解,那么来看看我们怎么使用泛型吧
  先来看看如何定义一个泛型类
  class 类名<泛型类型(一般使用T,K,V,N,也可以使用别的)>{
      public 泛型类型 变量名;  //初始化一个泛型类型的变量
      public 泛型类型 方法名(泛型类型 变量名){
          代码块;
      }
  }
  应该,很清晰吧,都是之前学过的东西了
  那么来看看怎么使用的吧!
  这次测试还是我们的妹子类
  由于英文不好,主类名就用拼音了,见谅见谅
  public class fanxing {
      public static void main(String[] args) {
          Gril5_3<String> text = new Gril5_3<>("测试成功");
          text.setT("hello");
          String a = text.getT();
          System.out.println(a);
      }
  }
  class Gril5_3<T>{
      private T t;
      public Gril5_3(T t){
          this.t = t;
          System.out.printf("测试泛型ddd  %s",t);
          System.out.println();
      }
      void setT(T t){
          this.t = t;
      }
      T getT(){
          return t;
      }
  }
  应该没什么问题吧,set和get用于封装,使用泛型类型替代了原来的类型,定义属性的时候也使用泛型类型替代
  运行结果:
  好好好,好啊,我们成功了!
  那么需要注意的是,我们在实例化前,我们的类型T可以是任意类型的,意思就是,你定义是什么类型,他就是什么类型的。
  4. 通配符
  通配符,就是字面意思,可以通用的符号
  不得不赞一句,见名知意的感觉是真的好,以后我们写代码的类啦,接口啦,方法啦,一定要记得这样命名,见名知意!!!
  一般用于集合中传递数据时
  1)当使用泛型类或者泛型接口,泛型的类型你自己都不确定的时候,可以通过通配符<?>表示。一旦程序当中使用泛型的通配符后,只能使用Object类中的共性的方法,集合中元素本身方法无法使用。
  此时只能接收数据,不能往集合当中存储数据。
  2)通配符的高级使用—受限泛型(泛型的上限和下限)
  上限:格式: 类型名称 <? extends 类名> 对象名称 意义:只能接受该类型及其子类
  下限:格式:类型名称 <? super 类名> 对象名称 意义:只能接受该类型及其父类
  示例说明
  public static void main(String[] args) {
      Collection<Integer> list01 = new ArrayList<Integer>();
      Collection<String>  list02 = new ArrayList<Integer>();
      Collection<Number>  list03 = new ArrayList<Integer>();
      Collection<Object>  list04 = new ArrayList<Integer>();
  }
  // 定义方法  用于接收任意的数据类型
  public static void getElement(Collection<?> coll) {//.....}
   // 定义方法 用于接收数字类型 Number类型或者Number的子类Integer等
  pubic static void getElement(Collection<? extends Number> coll){//...}    
  // 定义方法  用于接收Number类型及其父类的类型
  public static void getElement(Collection<? super Number> coll) {//....}

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号