Java 泛型的上界和下界通配符示例详解

 更新时间:2023年04月04日 13:31:01   作者:GeekTR  
这篇文章主要为大家通过示例介绍了Java 泛型的上界和下界通配符,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

介绍

Java中的泛型是一种强类型的机制,允许我们在编译时检查类型的安全性,以避免在运行时出现类型转换异常。泛型的上界和下界用于限制泛型类型参数的范围,本文将会详细介绍它们的概念和用法。

上界

泛型的上界指定了类型参数必须是某个类的子类或者实现了某个接口。它的语法形式为 T extends B,其中T是泛型类型参数,B是上界类型。例如,下面的代码展示了一个泛型类 Box,它的类型参数T必须是 Number 或其子类:

public class Box<T extends Number> {
    private T value;
    public Box(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }
}

在上面的代码中,我们使用了 extends 关键字来指定泛型类型参数的上界类型,这意味着泛型类型参数必须是 Number 或其子类。这样,我们就可以使用 Box 类来存储 IntegerDoubleFloat 等类型的值,因为它们都是 Number 的子类。另外,通过使用泛型的上界,我们可以确保 Box 类的实例中只存储 Number 类型的值,避免了类型转换异常的风险。

在使用泛型的时候,如果我们传入一个类型不符合上界限制的参数,则会在编译时发生错误,例如:

Box<String> box = new Box<>("Hello World");    // 编译错误:String 不是 Number 的子类

下界

泛型的下界指定了类型参数必须是某个类的超类或者是某个接口的实现类。它的语法形式为 T super B,其中T是泛型类型参数,B是下界类型。下面是一个示例,展示了一个泛型类 Box,它的类型参数T必须是 Object 或其超类:

public class Box<T super Object> {
    private T value;
    public Box(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }
}

在上面的代码中,我们使用了 super 关键字来指定泛型类型参数的下界类型,这意味着泛型类型参数必须是 Object 或其超类。这样,我们就可以使用 Box 类来存储 ObjectStringIntegerDouble 等类型的值,因为它们都是 Object 的子类。另外,通过使用泛型的下界,我们可以确保 Box 类的实例中存储的值都是 Object 类型,避免了类型转换异常的风险。

在使用泛型的时候,如果我们传入一个类型不符合下界限制的参数,则会在编译时发生错误,例如:

Box<Integer> box = new Box<>(123);    // 编译错误:Integer 不是 Object 的超类

上下界通配符

有时候,我们需要在泛型中同时使用上界和下界的限制,此时可以使用通配符 ? 来表示未知类型。例如,下面的代码展示了一个泛型方法 copy,它可以将一个数组的元素复制到另一个数组中:

public static <T> void copy(List<? extends T> src, List<? super T> dest) {
    for (T t : src) {
        dest.add(t);
    }
}

在上面的代码中,我们使用了通配符 ? 来表示未知类型,它可以同时满足 src 参数是 T 类型或其子类,dest 参数是 T 类型或其超类的限制条件。这样,我们就可以将任意类型的元素复制到另一个列表中了。通过使用上下界通配符,我们可以更加灵活地定义泛型方法,同时保证类型安全。

总结

Java中的泛型是一种强类型的机制,它能够在编译时检查类型的安全性。泛型的上界和下界用于限制类型参数的范围,它们可以让我们更精确地控制类型的使用。在使用泛型时,我们需要根据实际需求选择合适的上下界限制,以保证程序的正确性和可靠性。

除了上下界限制外,还可以使用通配符 ? 来表示未知类型,从而更加灵活地定义泛型类和方法。因此,学习和掌握泛型机制对于Java开发人员来说是非常重要的。

以上就是Java 泛型的上界和下界的详细内容,更多关于Java 泛型的上界和下界的资料请关注脚本之家其它相关文章!

相关文章

  • 在RedHat系统上安装JDK与Tomcat的步骤

    在RedHat系统上安装JDK与Tomcat的步骤

    这篇文章主要介绍了在RedHat系统上安装Java与Tomcat的步骤,同样适用于CentOS等RedHat系的Linux系统,需要的朋友可以参考下
    2015-11-11
  • Tomcat能起开,但是访问不进8080首页的问题解决方案

    Tomcat能起开,但是访问不进8080首页的问题解决方案

    这篇文章主要介绍了Tomcat能起开,但是访问不进8080首页的问题解决方案的相关资料,需要的朋友可以参考下
    2016-10-10
  • Spring Boot ActiveMQ连接池配置过程解析

    Spring Boot ActiveMQ连接池配置过程解析

    这篇文章主要介绍了Spring Boot ActiveMQ连接池配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java实现单人版五子棋游戏

    java实现单人版五子棋游戏

    这篇文章主要为大家详细介绍了java实现五子棋小游戏的相关资料,十分简单实用,有不错的参考借鉴价值,推荐给大家,需要的朋友可以参考下
    2016-02-02
  • spring如何动态指定具体实现类

    spring如何动态指定具体实现类

    这篇文章主要为大家详细介绍了spring如何动态指定具体实现类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Java mysql特殊形式的查询语句详解

    Java mysql特殊形式的查询语句详解

    这篇文章主要介绍了Java mysql特殊形式的查询,包括子查询和联合查询、自身连接查询问题,本文通过sql语句给大家介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 基于Hutool的图片验证码功能模块实现

    基于Hutool的图片验证码功能模块实现

    为了提高系统的安全性,防止接口被暴力刷新,验证码是个好的手段,图片验证码没有短信验证码的费用,其是个人开发者学习的重点,这篇文章主要介绍了基于Hutool的图片验证码功能模块实现,需要的朋友可以参考下
    2022-10-10
  • javaweb图书商城设计之购物车模块(3)

    javaweb图书商城设计之购物车模块(3)

    这篇文章主要为大家详细介绍了javaweb图书商城设计之购物车模块的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Spring和IDEA不推荐使用@Autowired 注解原因解析

    Spring和IDEA不推荐使用@Autowired 注解原因解析

    这篇文章主要为大家介绍了Spring和IDEA不推荐使用@Autowired 注解原因解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 解决springboot启动Logback报错ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rena

    解决springboot启动Logback报错ERROR in ch.qos.logback.cla

    这篇文章主要介绍了解决springboot启动Logback报错ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rena问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论