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

相关文章
|
安全 Java API
Java一分钟之-泛型通配符:上限与下限野蛮类型
【5月更文挑战第19天】Java中的泛型通配符用于增强方法参数和变量的灵活性。通配符上限`? extends T`允许读取`T`或其子类型的列表,而通配符下限`? super T`允许向`T`或其父类型的列表写入。野蛮类型不指定泛型,可能引发运行时异常。注意,不能创建泛型通配符实例,也无法同时指定上下限。理解和适度使用这些概念能提升代码的通用性和安全性,但也需兼顾可读性。
389 3
|
Java Go
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
171 0
|
安全 Java
Java 泛型使用(类、方法、接口协议、类型通配符、通配符上下限)
Java 泛型使用(类、方法、接口协议、类型通配符、通配符上下限)
313 0
|
存储 运维 Java
极简Java数据结构-环形队列突破上限
极简Java数据结构-环形队列突破上限
极简Java数据结构-环形队列突破上限
|
Java
java泛型上下限
前言:   java的泛型上下限不是很好理解,尤其像我这种菜鸡。反反复复看了好几遍了...,真是... 一、简单的继承体系 class Person{} class Student extends Person{} class Worker extends Person{} ...
1460 0
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
300 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
317 1