泛型中extends和super的区别
泛型中的 extends
和 super
关键字用于设置类型参数的上下界,控制可以传递给泛型类型的参数类型。它们的区别在于限制的方向和用途:
1.extends:
- 上界限制: 使用
extends
关键字定义了一个类型参数的上界,意味着传入的类型必须是指定类型或其子类型。 - 读取操作: 当泛型参数有上界限制时,允许进行读取(get)操作,因为可以确保所有对象至少有指定类型的方法和属性。
- 写入限制: 由于Java的类型擦除和安全性考虑,如果有上界限制,直接添加对象到集合可能会受到限制(特别是当使用非具体类型如
? extends T
时)。 - 示例:
List<? extends Number>
可以接受 List<Integer>
或 List<Double>
等,但你不能直接向这样的列表中添加元素,除了 null
,因为编译器无法确定确切的类型。
2.super:
- 下界限制: 使用
super
关键字定义了一个类型参数的下界,意味着传入的类型必须是指定类型或其父类型。 - 写入操作: 允许写入(put)操作,因为你总是可以向上转型为基类,所以可以安全地添加基类及其子类的实例。
- 读取限制: 读取时可能需要类型转换,因为集合中可能包含多种类型,所有只能通过基类引用访问。
- 示例:
List<? super Number>
可以接受 List<Number>
、List<Object>
或任何Number的父类的List,你可以向这样的列表中添加 Number
或其任何子类的实例。
总结来说,extends
通常用于确保可以安全地使用对象的特性(即读取),而 super
用于确保可以安全地插入对象(即写入)。在实际应用中,根据你需要执行的操作(读或写)来决定使用哪一个。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了