type
status
date
slug
summary
tags
category
icon
password
引言
Java泛型是Java SE 5引入的一项重大特性,通过类型参数化增强了代码的类型安全性和可读性。本文将聚焦于extendssuper关键字在Java泛型中的关键作用,揭示二者之间的核心差异,并通过详细的示例和应用场景深入解析,帮助读者全面理解其用法和价值。
一、extends关键词:类型参数的上界限定
首先,extends关键字在泛型中用于设定类型参数的上界,表明类型参数必须是某个特定类型或其子类型。以下是一个修复过的完整示例:
在这个例子中,readNumbers方法接受一个List<? extends Number>类型的参数,表明它可以处理任何Number或其子类类型的List。关键注意点
  1. 禁止写操作:对于这样定义的只读列表,我们不能向其添加元素,因为编译器无法确定List具体是容纳哪个Number子类型,以此防止类型安全风险。
  1. 安全的读操作:可以安全地从列表中读取元素,并将其视为Number类型处理。
应用场景
  • 设计泛型方法时,如果方法只需要读取某种基类或接口的子类型对象,无需写入操作,此时可以使用extends来指定上界,保证方法的类型安全性。
  • 在函数式接口如Function<T, R>Predicate<T>中,作为输入参数类型,确保传递的参数是某种基类或接口的子类型。
二、super关键词:类型参数的下界限定
接下来,super关键字用于设定类型参数必须是某个特定类型或其超类型。下面展示一个正确的使用示例:
在此例中,writeNumbers方法接收一个Collection<? super Integer>类型的参数,表示它可以处理任何能容纳Integer或其父类型的集合。注意要点
  1. 安全的写操作:可以向此类集合中添加Integer或其子类型的对象,因为Integer一定是传入集合类型的一个有效成员。
  1. 受限的读操作:读取集合中的元素时,由于编译器只知道类型参数是Integer的父类型,所以只能将其当作Object类型处理。
应用场景
  • 创建泛型方法时,如果方法需要向某个容器写入某种类型及其子类型的对象,但并不关心容器的具体类型,可以使用super来指定下界。
  • 实现通用的数据生产者或填充器,它们可以处理指定类型及其父类型对象,但无需知道具体的容器类型。
链接库文件libpq.so.5无法加载问题解决提升生产力的十个Python自动化脚本技巧及实战案例
  • Twikoo