zoukankan      html  css  js  c++  java
  • Java泛型之泛型参数

      在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java专业知识,广州疯狂java培训为你讲解;

      泛型机制常用的参数有3个:

      “?”代表任意类型。如果只指定了,而没有extends,则默认是允许任意类。

      extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类。

      super关键字声明了类型的下界,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object前提Fruit是Apple和Orange的超类。

      本章通过java代码逐一分析泛型参数的意义和区别extends参数:

      [java]

      public void extend(List list, Fruit fruit){

      Fruit now = list.get(0);

      System.out.println("now==>" + now);

      // Apple a = list.get(0); 无法通过编译

      Object o = list.get(0);

      System.out.println(o);

      // list.add(fruit); //这句话无法编译

      // list.add(new Object()); // 无法通过编译

      list.add(null);//这句可以编译,因为null没有类型信息

      }

      在上面的例子中,可以明确从list中取得的记录一定是Fruit,但是无法确定是Apple,list除了传入null外,不能添加其他任何参数;分析原因前先看以下的例子:

      [java]

      public void testExtendType(){

      List list = new ArrayList();

      List list2 = new ArrayList();

      List list3 = new ArrayList();

      extend(list2, new Apple());

      }

      从以上代码可以看出:

      extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类,List 可以指向 ArrayList()、ArrayList()、ArrayList()等。现在如果传入的参数list为new ArrayList(),则此时你向此list中添加Fruit,则肯定报错。而读取数据时,不管list是什么类型,读取的数据肯定都是Fruit,同时Fruit也是Object。

      通过以上的分析,知道直接往继承extends中的列表中添加记录是不行的,那么如何向extends修饰的list中添加记录,可以使用泛型方法来达到目的:

      [java]

      public void extendType2(List list, T date){

      list.add(date);

      }

      调用示例如下:

      [java]

      public void testExtendType2(){

      List list = new ArrayList();

      extendType2(list,new Apple());

      }

      super参数

      super用的不多,只简单介绍一下。

      [java]

      public void superType(List list, Apple apple){

      Object o = list.get(0);

      System.out.println(o);

      // Apple a = list.get(0); // 不能编译

      // Apple apple = list.get(0); // 不能编译

      list.add(apple);

      // list.add( new Object()); // 不能编译

      // list.add( new Fruit()); // 不能编译

      }

      在以上代码中,从list中读取的记录无法确定是任何类型(除Object),list除了添加Apple外,不能添加任何类型的对象(包括Object)。分析原因前先看以下代码:

      [java]

      public void testSuperType(){

      List list = new ArrayList();

      List list2 = new ArrayList();

      superType(list2, new Apple());

      }

      super关键字声明了类型的下界,表示参数化的类型是所指定的类型,或者是此类型的父类型,直至Object。List 可以引用 List,也可以引用 List,所以无法保证list中都是Apple,但是可以保证,所有list引用的都是Apple的父类,所有向此列表中添加Apple是没有问题的,而很显然你向List、List中添加Object、Fruit对象,肯定失败,只能够添加Apple。

      ?参数

      “?”代表任意类型。?可以看做 ? extends Object 的缩写。

      [java]

      public void wideCardType(List list, Fruit fruit ){

      Object o = list.get(0);

      System.out.println(list.get(0));

      // list.add(fruit); // 不能编译

      // list.add(new Object()); // 不能被编译

      }

      [java]

      public void testWideCardType(){

      /**

      * ? 可以看做 ? extends Object 的简化版

      */

      List list = new ArrayList();

      List list2 = new ArrayList();

      List list3 = new ArrayList

      疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!疯狂java培训中心地址:广州天河区车陂沣宏大厦3011。

  • 相关阅读:
    Windows下使用CMake编译SuiteSparse成VS工程
    【设计模式
    【设计模式
    vue过滤和复杂过滤
    el-tooltip 自定义样式
    el-table加表单验证
    使用Go env命令设置Go的环境
    面试官:GET 和 POST 两种基本请求方法有什么区别?
    解决 Vue 重复点击相同路由报错的问题
    利用promise和装饰器封装一个缓存api请求的装饰器工具
  • 原文地址:https://www.cnblogs.com/gojava/p/3202641.html
Copyright © 2011-2022 走看看