当前位置: 首页 > article >正文

Java 类型参数 T、R 、 O 、K、V 、E 、? 区别

在 Java 泛型和函数式编程中,TRO 都是类型参数(Type Parameters),它们的主要区别在于命名约定和上下文含义,而不是语言层面的区别。它们可以互换使用,但通常遵循一定的命名习惯以提高代码可读性。


1. 常见泛型参数命名约定

类型参数典型含义常见使用场景
TType(通用类型)表示任意类型,通常用于输入参数或通用类
RResult(结果类型)表示函数或方法的返回类型
OOutput(输出类型)类似于 R,表示输出类型
EElement(集合元素类型)常用于集合类(如 List<E>
KKey(键类型)用于 Map<K, V> 的键
VValue(值类型)用于 Map<K, V> 的值
U第二个泛型类型当需要多个泛型参数时使用
?无界通配符用于表示未知类型, 在泛型中提供了更灵活的用法,特别是在处理集合类时非常有用

2. T vs R vs O vs ? 的区别

(1) T(Type)

  • 表示输入参数的类型,通常用于:
    • 泛型类(如 List<T>
    • 函数式接口的输入参数(如 Predicate<T>
  • 示例
    public class Box<T> {private T value;  // T 可以是任何类型
    }
    

(2) R(Result)

  • 表示返回结果的类型,通常用于:
    • 函数式接口的返回值(如 Function<T, R>
    • 方法返回值的泛型
  • 示例
    Function<String, Integer> strToLength = s -> s.length();  // T=String, R=Integer
    

(3) O(Output)

  • 类似于 R,表示输出类型,但不如 R 常见
  • 通常用于自定义函数式接口(如 MapFunction<T, O>
  • 示例
    @FunctionalInterface
    interface MapFunction<T, O> {O map(T input);  // T=输入类型,O=输出类型
    }
    

(4) ?

? 是 Java 泛型中的通配符(wildcard),用于表示未知类型。它在泛型中提供了更灵活的用法,特别是在处理集合类时非常有用。

4.1基本用法
4.1.1. 无界通配符 <?>

表示可以接受任何类型:

List<?> list = new ArrayList<String>();  // 可以接受任何泛型类型的List
4.1.2. 上界通配符 <? extends T>

表示类型必须是 T 或其子类:

List<? extends Number> numbers = new ArrayList<Integer>();  // 可以是Number的任何子类
4.1.3. 下界通配符 <? super T>

表示类型必须是 T 或其父类:

List<? super Integer> list = new ArrayList<Number>();  // 可以是Integer的任何父类
4.2.使用场景
4.2.1. 读取数据(extends 生产者)
// 使用上界通配符,只能读取
void printNumbers(List<? extends Number> numbers) {for (Number n : numbers) {System.out.println(n);}// numbers.add(1);  // 编译错误,因为不确定具体类型
}
4.2.2. 写入数据(super 消费者)
// 使用下界通配符,可以写入
void addIntegers(List<? super Integer> list) {list.add(1);list.add(2);// Integer i = list.get(0);  // 编译错误,只能获取Object类型
}
4.2.3. 既读又写
// 不使用通配符,可以读写
void processList(List<Integer> list) {list.add(1);Integer i = list.get(0);
}
4.3. 重要规则
  1. PECS原则(Producer-Extends, Consumer-Super):

    • 生产者(只读)使用 extends
    • 消费者(只写)使用 super
  2. 通配符不能用于泛型类的实例化:

    List<?> list = new ArrayList<?>();  // 编译错误
    
  3. 通配符不能用于泛型方法的类型参数:

    <T> void method(List<T> list) {}  // 正确
    <?> void method(List<?> list) {}   // 编译错误
    
示例代码
public class WildcardExample {public static void main(String[] args) {// 上界通配符示例List<Integer> intList = Arrays.asList(1, 2, 3);printNumbers(intList);// 下界通配符示例List<Number> numList = new ArrayList<>();addIntegers(numList);System.out.println(numList);  // 输出 [1, 2]}// 上界通配符 - 只读static void printNumbers(List<? extends Number> numbers) {numbers.forEach(System.out::println);}// 下界通配符 - 可写static void addIntegers(List<? super Integer> list) {list.add(1);list.add(2);}
}
  1. 示例对比

接口/类输入类型输出类型说明
Function<T, R>TRJava 标准库
MapFunction<T, O>TO自定义接口
Predicate<T>Tboolean返回固定类型
Supplier<T>T无输入,返回 T

http://www.lryc.cn/news/2403563.html

相关文章:

  • 中医的十问歌和脉象分类
  • C#封装HttpClient:HTTP请求处理最佳实践
  • 前端基础之《Vue(19)—状态管理》
  • 构建 MCP 服务器:第 4 部分 — 创建工具
  • 2.1 Windows编译环境介绍
  • 如何以 9 种方式将照片从手机传输到笔记本电脑
  • 生成JavaDoc文档
  • 八股学习-JS的闭包
  • Web后端基础(Maven基础)
  • 学习记录aigc
  • set map数据结构
  • Q: dify前端使用哪些开发框架?
  • 面试题小结(真实面试)
  • 【PmHub面试篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现面试专题解析
  • 计算机网络领域所有CCF-A/B/C类期刊汇总!
  • 有意向往gis开发靠,如何规划学习?
  • 五、查询处理和查询优化
  • 缓解骨质疏松 —— 补钙和补维 D
  • 《PMBOK® 指南》第八版草案重大变革:6 大原则重构项目管理体系
  • Ctrl+R 运行xxx.exe,发现有如下问题.
  • 极智项目 | 基于PyQT+Whisper实现的语音识别软件设计
  • vue+cesium示例:地形开挖(附源码下载)
  • 升级:用vue canvas画一个能源监测设备和设备的关系监测图!
  • Elasticsearch + Milvus 构建高效知识库问答系统《一》
  • 深入理解 transforms.Normalize():PyTorch 图像预处理中的关键一步
  • leetcode 2434. 使用机器人打印字典序最小的字符串 中等
  • 爆炸仿真的学习日志
  • 【Fiddler抓取手机数据包】
  • [华为eNSP] OSPF综合实验
  • 东芝Toshiba DP-4528AG打印机信息