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日

相关文章

  • mybatis实体类字段大小写及字段获取不到值问题

    当然!下面是关于\”mybatis实体类字段大小写及字段获取不到值问题\”的完整攻略: mybatis实体类字段大小写及字段获取不到值问题 在使用 MyBatis 进行数据库操作时,可能会遇到实体类字段大小写不一致或字段获取不到值的问题。以下是两个示例: 示例1:实体类字段大小写不一致问题 在数据库表和实体类字段命名不一致的情况下,可以通过在 SQL 映射文…

    other 2023年8月19日
    00
  • CentOS如何设置终端显示字符界面区域的大小?

    下面是CentOS如何设置终端显示字符界面区域的大小的完整攻略: 1. 查看当前终端的窗口大小 在终端中输入以下命令,即可查看当前终端窗口的大小: $ stty size 该命令输出两个数字,第一个数字表示行数,第二个数字表示列数。例如: $ stty size 24 80 表示当前终端窗口为24行、80列。 2. 设置终端窗口大小 要设置终端窗口的大小,可…

    other 2023年6月27日
    00
  • ASP.NET中集成百度编辑器UEditor

    一、 关于UEditor UEditor是百度开源的所见即所得富文本编辑器,支持插入图片、视频和音乐等丰富功能。UEditor可以轻松集成到各种web应用中,让用户可以方便地创建、编辑和管理内容。 二、 在ASP.NET中集成UEditor 在ASP.NET中集成UEditor,需要完成以下步骤: 下载UEditor:从官网(http://ueditor.b…

    other 2023年6月20日
    00
  • c++作用域运算符用法(全局变量和局部变量)

    C++作用域运算符用法(全局变量和局部变量) C++中的作用域运算符(::)用于访问全局变量和局部变量。它允许我们在不同的作用域中访问同名的变量。 全局变量 全局变量是在任何函数之外声明的变量,可以在整个程序中访问。作用域运算符可以用于访问全局变量。 下面是一个示例: #include <iostream> int globalVariable …

    other 2023年7月29日
    00
  • 电脑右键菜单中的SkyDrive Pro选项是灰色怎么办

    当电脑右键菜单中的SkyDrive Pro选项是灰色时是因为您的电脑或者您的账户设置了一些限制。要解决这个问题,您可以按照以下步骤进行操作: 1. 确认账户是否已登录 首先,您需要确保您已经成功登录到您的SkyDrive Pro账户。如果您没有成功登录,那么SkyDrive Pro选项会被禁用,显示为灰色。您可以打开SkyDrive Pro网站并尝试登录,确…

    other 2023年6月27日
    00
  • 手把手带你理解java线程池之工作队列workQueue

    标题:手把手带你理解Java线程池之工作队列WorkQueue 1. 什么是工作队列(WorkQueue) 在Java线程池中,工作队列(WorkQueue)用于存储还未被执行的任务,当线程池接收到新的任务时,它会将该任务添加到工作队列中。线程池中的线程会不断从工作队列中取出任务并执行。当工作队列中没有可执行的任务时,线程池中的线程也会进入等待状态。 Jav…

    other 2023年6月27日
    00
  • springboot整合mybatis-plus逆向工程的实现

    Spring Boot整合MyBatis-Plus逆向工程的实现攻略 简介 MyBatis-Plus是一个强大的Java持久层框架,提供了逆向工程(Reverse Engineering)功能,可以根据数据库表结构自动生成实体类、Mapper接口、Service接口等代码,极大地提高了开发效率。 步骤 以下是使用Spring Boot整合MyBatis-Pl…

    other 2023年10月13日
    00
  • Android中使用TextView实现文字跑马灯效果

    当在Android应用程序中使用TextView实现文字跑马灯效果时,可以按照以下完整攻略进行操作: … … 在布局文件中,创建一个TextView,并设置相应的属性来实现跑马灯效果。 <TextView android:id=\"@+id/marqueeTextView\" … android:layout_width…

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