type
status
date
slug
summary
tags
category
icon
password
引言
Java泛型是Java SE 5引入的一项重大特性,通过类型参数化增强了代码的类型安全性和可读性。本文将聚焦于
extends和super关键字在Java泛型中的关键作用,揭示二者之间的核心差异,并通过详细的示例和应用场景深入解析,帮助读者全面理解其用法和价值。一、extends关键词:类型参数的上界限定
首先,
extends关键字在泛型中用于设定类型参数的上界,表明类型参数必须是某个特定类型或其子类型。以下是一个修复过的完整示例:在这个例子中,
readNumbers方法接受一个List<? extends Number>类型的参数,表明它可以处理任何Number或其子类类型的List。关键注意点:- 禁止写操作:对于这样定义的只读列表,我们不能向其添加元素,因为编译器无法确定List具体是容纳哪个Number子类型,以此防止类型安全风险。
- 安全的读操作:可以安全地从列表中读取元素,并将其视为Number类型处理。
应用场景:
- 设计泛型方法时,如果方法只需要读取某种基类或接口的子类型对象,无需写入操作,此时可以使用
extends来指定上界,保证方法的类型安全性。
- 在函数式接口如
Function<T, R>或Predicate<T>中,作为输入参数类型,确保传递的参数是某种基类或接口的子类型。
二、super关键词:类型参数的下界限定
接下来,
super关键字用于设定类型参数必须是某个特定类型或其超类型。下面展示一个正确的使用示例:在此例中,
writeNumbers方法接收一个Collection<? super Integer>类型的参数,表示它可以处理任何能容纳Integer或其父类型的集合。注意要点:- 安全的写操作:可以向此类集合中添加Integer或其子类型的对象,因为Integer一定是传入集合类型的一个有效成员。
- 受限的读操作:读取集合中的元素时,由于编译器只知道类型参数是Integer的父类型,所以只能将其当作Object类型处理。
应用场景:
- 创建泛型方法时,如果方法需要向某个容器写入某种类型及其子类型的对象,但并不关心容器的具体类型,可以使用
super来指定下界。
- 实现通用的数据生产者或填充器,它们可以处理指定类型及其父类型对象,但无需知道具体的容器类型。
- Author:worst developer
- URL:https://blog.hiyb.top/article/20
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!