Java 泛型上限和下限

简介: Java 泛型上限和下限

在Java中,泛型(Generics)提供了一种方式来编写具有类型安全性的代码,同时保持代码的灵活性。泛型上限(Upper Bound)和下限(Lower Bound)是泛型类型参数的两种约束,它们允许你限制泛型类型参数可以被哪些类型实例化。

泛型上限(Upper Bound)

上限是指定泛型类型参数可以扩展的类型。这意味着泛型类型参数必须是指定类或接口的子类型。

public class MyClass<T extends Number> {
   
    private T data;

    public MyClass(T data) {
   
        this.data = data;
    }

    public void printData() {
   
        System.out.println(data);
    }
}

// 使用上限
MyClass<Integer> myClass = new MyClass<>(123);

在这个例子中,MyClass<T extends Number> 定义了一个上限为 Number 的泛型类型参数 T。这意味着 T 可以是 IntegerDoubleFloatNumber 类型的子类型。

泛型下限(Lower Bound)

下限是指定泛型类型参数可以是哪些类型的超类型。这意味着泛型类型参数必须是指定类或接口的超类型。

public class MyClass<T super String> {
   
    private T data;

    public MyClass(T data) {
   
        this.data = data;
    }

    public void printData() {
   
        System.out.println(data);
    }
}

// 使用下限
MyClass<String> myClass = new MyClass<>("Hello");

在这个例子中,MyClass<T super String> 定义了一个下限为 String 的泛型类型参数 T。这意味着 T 可以是 String 类型或其超类型,但实际上在Java中,你通常不会定义泛型的下限,因为Java不支持协变和逆变。

通配符(Wildcards)

在泛型的上下文中,通配符 ? 也可以用来指定上限或下限。

  • ? extends X 表示上限为 X
  • ? super X 表示下限为 X

泛型边界的限制

在Java中,泛型边界有一些限制:

  1. 泛型类型参数不能直接使用基本数据类型。
  2. 泛型类型参数不能直接使用 void 类型。
  3. 泛型类型参数不能直接使用数组类型。

泛型边界的应用

泛型边界在集合类中非常有用,例如 List<? extends Number> 可以用来接收任何 Number 类型或其子类型的列表。

总结

泛型上限和下限为Java泛型提供了灵活性和类型安全性。通过使用边界,你可以确保泛型类型参数符合特定的类型约束,从而编写更安全、更可靠的代码。

相关文章
|
6月前
|
安全 Java API
Java一分钟之-泛型通配符:上限与下限野蛮类型
【5月更文挑战第19天】Java中的泛型通配符用于增强方法参数和变量的灵活性。通配符上限`? extends T`允许读取`T`或其子类型的列表,而通配符下限`? super T`允许向`T`或其父类型的列表写入。野蛮类型不指定泛型,可能引发运行时异常。注意,不能创建泛型通配符实例,也无法同时指定上下限。理解和适度使用这些概念能提升代码的通用性和安全性,但也需兼顾可读性。
64 3
|
6月前
|
Java Go
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
|
安全 Java
Java 泛型使用(类、方法、接口协议、类型通配符、通配符上下限)
Java 泛型使用(类、方法、接口协议、类型通配符、通配符上下限)
107 0
|
存储 运维 Java
极简Java数据结构-环形队列突破上限
极简Java数据结构-环形队列突破上限
极简Java数据结构-环形队列突破上限
|
Java
java泛型上下限
前言:   java的泛型上下限不是很好理解,尤其像我这种菜鸡。反反复复看了好几遍了...,真是... 一、简单的继承体系 class Person{} class Student extends Person{} class Worker extends Person{} ...
1335 0
|
9天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
81 38
|
6天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?