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

yizhihongxing

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日

相关文章

  • rapidjson使用总结

    RapidJSON使用总结 RapidJSON是一个快速的C++ JSON解析器/生成器,它提供了高效的内存管理和可扩展性。本文将介绍如何使用RapidJSON解析和生成JSON数据,包括创建JSON对象、字符串、数字和布尔值等。 步骤一:安装RapidJSON RapidJSON是一个开源库可以从其官方网站上下载最新版本的代码。下载后,将其包含在您的C++…

    other 2023年5月8日
    00
  • TypeScript利用TS封装Axios实战

    下面是“TypeScript利用TS封装Axios实战”的完整攻略: 前置要求 在开始使用TypeScript封装Axios前,需要确保已经安装并了解以下知识: Node.js:用于在本地运行TypeScript和生成JavaScript文件。 TypeScript:在Node.js环境下编写TypeScript代码,需要先进行TypeScript的安装和配…

    other 2023年6月25日
    00
  • 汇编语言系列之汇编实现各种码制的转换(思路详解)

    汇编语言系列之汇编实现各种码制的转换(思路详解) 本攻略将详细讲解如何使用汇编语言实现各种码制的转换。我们将提供思路和示例代码,以帮助您理解和实践这些转换过程。 思路概述 了解码制的基本概念:在进行码制转换之前,我们需要了解不同码制的特点和表示方法。常见的码制包括二进制、十进制、十六进制等。每种码制都有其独特的表示规则和转换方式。 选择合适的转换算法:根据不…

    other 2023年8月18日
    00
  • ubuntu12.04软件安装指南

    Ubuntu 12.04 软件安装指南 Ubuntu 12.04是一款稳定的操作系统,被广泛应用于服务器、桌面电脑等领域。但是,对于新手来说,在Ubuntu 12.04上安装应用程序并不是一件容易的事情,本文将为您提供一些关于Ubuntu 12.04软件安装的指南。 通过命令行安装软件 Ubuntu 12.04有一个命令行包管理工具apt,可以让我们方便地下…

    其他 2023年3月28日
    00
  • [下载]安卓6.0/Android M第三个开发者预览版固件下载地址

    下载安卓6.0/Android M第三个开发者预览版固件下载地址 安卓6.0/Android M第三个开发者预览版现已推出,下载地址如下: 步骤1:为您的设备下载正确的固件 请确保您下载的固件与您的设备和型号相匹配,以避免因下载错误的固件导致问题。 示例说明1:如果您的设备是Nexus 6,那么您应该下载“shamu”的固件。 示例说明2:如果您的设备是Ne…

    other 2023年6月26日
    00
  • 数字锁定和大小写锁定的指示符设置方法

    数字锁定和大小写锁定的指示符设置方法攻略 数字锁定和大小写锁定的指示符是用来显示键盘上数字锁定和大小写锁定状态的功能。在本攻略中,我们将详细介绍如何设置这些指示符。 数字锁定指示符设置方法 打开计算机的控制面板。 在控制面板中,找到并点击\”时钟、语言和区域\”选项。 在\”时钟、语言和区域\”页面中,点击\”区域和语言\”选项。 在\”区域和语言\”页面中…

    other 2023年8月17日
    00
  • 详解Java Callable接口实现多线程的方式

    下面是详解Java Callable接口实现多线程的完整攻略: 1. Callable接口的概述 在Java多线程中,有两种方式可以实现多线程,分别是继承Thread类和实现Runnable接口。除此之外,还有一种方式是通过实现Callable接口来实现多线程,这种方式相比前两种方式,有以下优势: 支持返回运算结果,可以通过FutureTask等类获取返回值…

    other 2023年6月27日
    00
  • java-从int转换为二进制

    Java中将int转换为二进制攻略 在Java中,我们可以将整数转换为二进制字符串。以下是一个完整的攻略,介绍如何在Java中将int转换为二进制。 步骤1:使用Integer.toBinaryString() Java中,我们可以使用Integer类的toBinaryString()方法将整数转换为二进制字符串。以下是一个示例: int num = 10;…

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