Java使用通配符实现增强泛型详解

 更新时间:2022年08月18日 11:32:52   作者:小虚竹and掘金  
泛型是JAVA重要的特性,使用泛型编程,可以使代码复用率提高。本文将利用通配符实现增强泛型,文中的示例代码讲解详细,感兴趣的可以了解一下

使用通配符增强泛型

1.题目

泛型是JAVA重要的特性,使用泛型编程,可以使代码复用率提高。

实现:在泛型方法中使用通配符

2.解题思路

创建一个类:WildcardsTest。

创建一个方法getMiddle()用于获得给定列表的中间值。

在泛型中,使用“?”作为通配符,通配符的使用与普通的类型参数类似,如通配符可以利用extends关键字来设置取值的上限。如

<? extends Number>

表示Byte,Double,Float,Integer都适合这个类型参数。

还有,有上限,也有下限,如

<? super Number>

w含义是类型参数是Number类的父类,如Object.

3.代码详解

package com.xiaoxuzhu;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * Description:
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/10.1	    xiaoxuzhu		2022/5/10		    Create
 * </pre>
 * @date 2022/5/10
 */

public class WildcardsTest {
    public static Object getMiddle(List<? extends Number> list) {
        return list.get(list.size() / 2);
    }

    public static void main(String[] args) {
        List<Integer> ints = new ArrayList<Integer>();
        ints.add(1);
        ints.add(2);
        ints.add(3);
        System.out.print("整型列表的元素:");
        System.out.println(Arrays.toString(ints.toArray()));
        System.out.println("整型列表的中间数:" + getMiddle(ints));
        List<Double> doubles = new ArrayList<Double>();
        doubles.add(1.1);
        doubles.add(2.2);
        doubles.add(3.3);
        System.out.print("浮点列表的元素:");
        System.out.println(Arrays.toString(doubles.toArray()));
        System.out.println("浮点列表的中间数:" + getMiddle(doubles));
    }
}

知识点补充

泛型

可以用<T>、<B,N>、<T extends User>等进行泛型的声明。其中<T extends User>的声明方式限定了T的范围,T只能为 User的子类。

1.参数类型用在类的创建中,泛型类。

2.参数类型用在接口的创建中,泛型接口。

3.参数类型用在方法的创建中,泛型方法。注意泛型<T>的声明位置,在方法的修饰符之后,返回值类型之前。

? 类型通配符

通配符的几种形式:

1.无限定通配符,<?>。

2.上限通配符,<? extends User>。表示参数类型只能是User的子类。

3.下限通配符,<? super User>。表示参数类型只能是User的父类。

public class P<T> {
  private T t;
  public T getT(){
    return t;
  }

  //通配符
  //设置指定类型的范围,超过范围就会报错
  //extends : 指定范围必须是其(这里是List)子类
  public void set(P<? extends List> list){
    return;
  }

  //super : 指定类型必须是其(这里是List)父类
  public void setSuper(P<? super List> list){
    return;
  }

  public static void main(String[] args) {
    new P<String>(); //T会被替换成String
    new P<Integer>(); //T会被替换成Integer
    Person<String,List,Double,User> person = new Person<String,List,Double,User>();//T会被替换成String,B会被替换成List...
    person.eat("鱼");
  }
}
class User<T extends P>{//这里给类的泛型指定范围,T必须要继承类P。

}
//一个类可以同时指定多个泛型
class Person<T,B,S,N>{
  private T t;
  private B b;
  private S s;
  private N n;
  public void eat(T t){
    this.t = t;
    System.out.println("我正在吃"+this.t);
  }
}

泛型的声明表明,在类、接口、方法的创建中,要使用一个未知的数据类型。它可以是Integer类型,也可以是String类型。就把它的类型定义成 T 、S 或者是N等等。

在实例化的时候,就必须声明T具体是一个什么类型。

在定义泛型对象的使用方法时,还不知道T是什么类型,它可能是String类型,也可能是Integer类型。如果,把T定义成一个确定的泛型数据类型,参数就只能是这种数据类型。此时,就用到了通配符代替确定的泛型数据类型。

使用泛型、通配符提高了代码的复用性。

把一个对象分为声明、使用两部分的话。泛型侧重于类型的声明上代码复用,通配符则侧重于使用上的代码复用。泛型用于定义内部数据类型的不确定性,通配符则用于定义使用的对象类型不确定性。

到此这篇关于Java使用通配符实现增强泛型详解的文章就介绍到这了,更多相关Java增强泛型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中@PathVariable、@RequestParam和@RequestBody的区别和使用详解

    SpringBoot中@PathVariable、@RequestParam和@RequestBody的区别和使用详解

    这篇文章主要介绍了SpringBoot中@PathVariable、@RequestParam和@RequestBody的区别和使用详解,@PathVariable 映射 URL 绑定的占位符,通过@RequestMapping注解中的{}占位符来标识URL中的变量部分,需要的朋友可以参考下
    2024-01-01
  • Java之单链表问题解决案例讲解

    Java之单链表问题解决案例讲解

    这篇文章主要介绍了Java之单链表问题解决案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Spring AOP有多少个通知以及它们的执行顺序介绍

    Spring AOP有多少个通知以及它们的执行顺序介绍

    这篇文章主要介绍了Spring AOP有多少个通知以及它们的执行顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 10分钟带你理解Java中的反射

    10分钟带你理解Java中的反射

    反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这篇文章带大家十分钟快速理解Java中的反射,有需要的可以参考借鉴。
    2016-08-08
  • 一文吃透 Spring 中的 AOP 编程

    一文吃透 Spring 中的 AOP 编程

    这篇文章主要介绍了springboot中的AOP编程,本文介绍的非常详细,有一定的参考价值,感兴趣的小伙伴可以借鉴一下
    2023-04-04
  • Springboot Druid 自定义加密数据库密码的几种方案

    Springboot Druid 自定义加密数据库密码的几种方案

    这篇文章主要介绍了Springboot Druid 自定义加密数据库密码的步骤,帮助大家更好的理解和使用springboot,感兴趣的朋友可以了解下
    2020-12-12
  • Java使用跳转结构实现队列和栈流程详解

    Java使用跳转结构实现队列和栈流程详解

    这篇文章主要介绍了Java使用跳转结构实现队列和栈流程,连续结构和跳转结构是数据结构中常见的两种基本数据结构,而我们本次的主角栈和队列都 既可以使用使用跳转结构实现也可以使用连续结构实现
    2023-04-04
  • 解决Unable to start embedded container SpringBoot启动报错问题

    解决Unable to start embedded container&nbs

    这篇文章主要介绍了解决Unable to start embedded container SpringBoot启动报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SpringIOC控制反转的原理详解

    SpringIOC控制反转的原理详解

    这篇文章主要介绍了SpringIOC控制反转的原理详解,本来管理业务对象(bean)的操作是由我们程序员去做的,但是有了 Spring 核心容器后,这些 Bean 对象的创建和管理交给我们Spring容器去做了,也就是控制权由程序员变成了容器,需要的朋友可以参考下
    2023-08-08
  • 解读Integer类的parseInt和valueOf的区别

    解读Integer类的parseInt和valueOf的区别

    这篇文章主要介绍了解读Integer类的parseInt和valueOf的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论