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泛型提供了灵活性和类型安全性。通过使用边界,你可以确保泛型类型参数符合特定的类型约束,从而编写更安全、更可靠的代码。

相关文章
|
8月前
|
安全 Java API
Java一分钟之-泛型通配符:上限与下限野蛮类型
【5月更文挑战第19天】Java中的泛型通配符用于增强方法参数和变量的灵活性。通配符上限`? extends T`允许读取`T`或其子类型的列表,而通配符下限`? super T`允许向`T`或其父类型的列表写入。野蛮类型不指定泛型,可能引发运行时异常。注意,不能创建泛型通配符实例,也无法同时指定上下限。理解和适度使用这些概念能提升代码的通用性和安全性,但也需兼顾可读性。
73 3
|
8月前
|
Java Go
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
|
安全 Java
Java 泛型使用(类、方法、接口协议、类型通配符、通配符上下限)
Java 泛型使用(类、方法、接口协议、类型通配符、通配符上下限)
122 0
|
存储 运维 Java
极简Java数据结构-环形队列突破上限
极简Java数据结构-环形队列突破上限
极简Java数据结构-环形队列突破上限
|
Java
java泛型上下限
前言:   java的泛型上下限不是很好理解,尤其像我这种菜鸡。反反复复看了好几遍了...,真是... 一、简单的继承体系 class Person{} class Student extends Person{} class Worker extends Person{} ...
1346 0
|
8天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
10天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。