Java泛型之上界下界通配符详解

Java泛型之上界下界通配符详解

在Java泛型中,通配符是一个非常强大的概念。它可以让我们在类型参数定义中使用限制,以控制传递给泛型的参数类型。本篇攻略将会详细讲解Java泛型中通配符的上界和下界以及如何使用通配符实现灵活而精细的类型限制。

上界通配符

我们知道在Java泛型中我们可以使用限定符来对类型参数进行限定,被限定的类型参数必须继承自该限定符指定的上界类型。上界通配符使用的符号是 extends,特别地,如果没有指定上界通配符,则默认为上界为Object类型。

public <T extends Number> void test(T t) {
    // 方法体
}

上述代码定义了一个方法,该方法定义了一个泛型类型T,限定T必须继承自Number类型。这个表示方式使得传递给test方法的参数必须是继承自Number类的类型,比如Integer、Float、Double等。

如果我们希望能够接受更宽泛的类型,则可以使用Object类型作为上界,例如:

public <T extends Object> void test(T t) {
    // 方法体
}

这个表示方式意味着,传递给test方法的参数可以是任意类型。

下界通配符

在Java泛型中还存在下界通配符。下界通配符使用的符号是 super,它可以允许泛型类型参数的输入参数为该限定符指定的下界类型或其超类。

public <T super Number> void test(T t) {
    // 方法体
}

上述代码使用了下界通配符,它指定了泛型类型参数T必须是Number类型或其子类。这个表示方式意味着,传递给test方法的参数可以是Number、Object类型。

示例说明

上界通配符示例

public class UpperBoundDemo {
    public static void main(String[] args) {
        List<? extends Number> list1 = new ArrayList<Integer>();
        List<? extends Number> list2 = new ArrayList<Float>();
        List<? extends Number> list3 = new ArrayList<Double>();
        getData(list1);
        getData(list2);
        getData(list3);
        // getData(new ArrayList<String>());编译错误,在getData方法中不能将String类型的list传递给参数list1、list2、list3
    }

    public static void getData(List<? extends Number> list) {
        System.out.println("data: " + list.get(0));
    }
}

上述代码定义了一个泛型方法getData,该方法接收一个泛型类型参数为List<? extends Number>。该泛型类型参数是一个上界通配符,表示接受任何继承自Number类型的List集合。

我们可以看出,在调用getData方法的时候,我们可以将值类型为Integer、Float、Double的List集合传递给该方法,但是不可以传递String类型的List集合给该方法。

下界通配符示例

public class LowerBoundDemo {
    public static void main(String[] args) {
        List<? super Integer> list1 = new ArrayList<Integer>();
        List<? super Integer> list2 = new ArrayList<Number>();
        List<? super Integer> list3 = new ArrayList<Object>();
        setData(list1);
        setData(list2);
        setData(list3);
        // setData(new ArrayList<Float>());编译错误,在setData方法中不能将Float类型的list传递给参数list1、list2、list3
    }

    public static void setData(List<? super Integer> list) {
        list.add(new Integer(50));
    }
}

上述代码定义了一个泛型方法setData,该方法接收一个泛型类型参数为List<? super Integer>。该泛型类型参数是一个下界通配符,表示接受Integer类型及其父类的List集合。

我们可以看出,在调用setData方法的时候,我们可以将值类型为Integer、Number、Object的List集合传递给该方法,但是不可以传递Float类型的List集合给该方法。

结论

在Java泛型的使用中,通配符是非常重要的概念,对于上界和下界的使用可以使得类型参数得到更加灵活、高效、安全的使用。同时在使用通配符的过程中需要注意类型参数的需要,以达到良好的代码可读性、可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java泛型之上界下界通配符详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Powershell获取环境变量的方法

    当我们在编写Powershell脚本时,有时需要获取操作系统的环境变量信息,比如获取用户的主目录路径、获取系统的临时文件夹路径等等。下面是Powershell获取环境变量的方法的完整攻略: 1. 使用Get-ChildItem命令 我们可以使用Powershell内置的Get-ChildItem命令来获取操作系统的环境变量信息。其中,操作系统的环境变量被保存…

    other 2023年6月27日
    00
  • DOTNETBAR制作圆角窗体和圆角控件代码实例

    首先,我们需要了解什么是DotNetBar。DotNetBar是一个用于Windows.Forms应用程序的控件库,它提供了一系列美观、容易使用的控件和工具栏,并支持自定义皮肤、打印和报表、图像处理、XML等。它由 DevComponents 公司开发并维护。 接下来,我们将详细讲解如何使用DotNetBar制作圆角窗体和圆角控件。 制作圆角窗体 1. 创建…

    other 2023年6月26日
    00
  • 小白谈谈对JS原型链的理解

    下面我将为你详细讲解JS原型链的完整攻略。 JS 原型链 JS 原型链是 JS 中实现继承的重要机制之一,它可以让我们避免代码冗余,提高代码的可维护性。在学习原型链之前,我们先了解一下 JS 中的构造函数和对象。 构造函数和对象 在 JS 中,我们可以通过构造函数来创建新的对象,其方法如下: function Person(name) { this.name…

    other 2023年6月26日
    00
  • Spring Bean生命周期之Bean元信息的配置与解析阶段详解

    接下来我将详细讲解“Spring Bean生命周期之Bean元信息的配置与解析阶段详解”的完整攻略。 Spring Bean的元信息 在Spring中,Bean的元信息是Spring容器在启动时读取配置文件或注解生成的BeanDefinition,它主要包含Bean的定义、Bean的依赖、Bean的作用域、延迟加载等一系列的Bean属性配置。通常情况下,我们…

    other 2023年6月27日
    00
  • .gitignore文件作用及使用方法详解

    当使用Git管理代码时,我们经常需要忽略掉一些文件或目录,例如日志文件、缓存文件等,这些文件不需要提交到Git仓库中,但每次修改文件后都需要手动排除这些文件,不仅费时费力,而且容易出错。 为了解决这个问题,Git提供了一个简单易用的解决方案:.gitignore文件。.gitignore文件用来告诉Git哪些文件或目录不需要进行版本控制,Git会在提交时自动…

    other 2023年6月27日
    00
  • Android四大组件之Service详解

    Android四大组件之Service详解 在Android开发中,Service是非常重要的四大组件之一。它可以在后台执行一些操作,不需要与用户交互。本篇攻略将详细讲解Service的相关内容,包括什么是Service,Service的生命周期,如何开启和停止Service,如何使用bindService方法以及如何在Service中处理耗时操作等。 什么…

    other 2023年6月27日
    00
  • .NET中获取程序根目录的常用方法介绍

    获取程序根目录在.NET中是一项常见的需求,因为程序可能需要读取配置文件、提供给用户下载的文件等。下面我们将介绍.NET中获取程序根目录的3种常用方法。 1. 使用AppDomain.CurrentDomain.BaseDirectory string baseDirectory = AppDomain.CurrentDomain.BaseDirectory…

    other 2023年6月27日
    00
  • echarts重新初始化

    以下是“echarts重新初始化”的完整攻略: echarts重新初始化 ECharts是一款基于JavaScript的开源可视化库,用于创建交互式的图表和地图。在使用ECharts时,有时需要重新初始化图表,以便在不刷新页面的情况下更新数据或更改配置。以下是使用ECharts重新初始化的步骤: 获取ECharts实例 在重新初始化ECharts之前,您需要…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部