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);
AI 代码解读

在这个例子中,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");
AI 代码解读

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

目录
打赏
0
4
4
0
85
分享
相关文章
|
10月前
|
Java一分钟之-泛型通配符:上限与下限野蛮类型
【5月更文挑战第19天】Java中的泛型通配符用于增强方法参数和变量的灵活性。通配符上限`? extends T`允许读取`T`或其子类型的列表,而通配符下限`? super T`允许向`T`或其父类型的列表写入。野蛮类型不指定泛型,可能引发运行时异常。注意,不能创建泛型通配符实例,也无法同时指定上下限。理解和适度使用这些概念能提升代码的通用性和安全性,但也需兼顾可读性。
88 3
|
10月前
|
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
Java 泛型使用(类、方法、接口协议、类型通配符、通配符上下限)
Java 泛型使用(类、方法、接口协议、类型通配符、通配符上下限)
140 0
java泛型上下限
前言:   java的泛型上下限不是很好理解,尤其像我这种菜鸡。反反复复看了好几遍了...,真是... 一、简单的继承体系 class Person{} class Student extends Person{} class Worker extends Person{} ...
1361 0
|
1月前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
166 60
【Java并发】【线程池】带你从0-1入门线程池
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
68 23
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等