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

news2025/6/8 1:14:58

在 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.coloradmin.cn/o/2403563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中医的十问歌和脉象分类

中医核心理论框架如下 诊断技术如下 本文主要介绍问诊和切诊。 十问歌的“十”是虚指&#xff0c;实际包含12个核心问题&#xff0c;脉象28种中常见仅10余种&#xff0c;重点解释脉诊的物理本质&#xff08;血流动力学触觉感知&#xff09; 以下是中医十问歌的完整内容及脉…

构建 MCP 服务器:第 4 部分 — 创建工具

这是我们构建 MCP 服务器的四部分教程的最后一部分。在第一部分中&#xff0c;我们使用基本资源创建了第一个 MCP 服务器。第二部分添加了资源模板并改进了代码组织。在第三部分中&#xff0c;我们添加了提示符并进一步完善了服务器结构。现在&#xff0c;我们将通过添加工具来…

如何以 9 种方式将照片从手机传输到笔记本电脑

使用 USB 电缆可以将照片从智能手机复制到计算机。但是&#xff0c;如果没有 USB 数据线&#xff0c;如何将照片从手机无线传输到笔记本电脑呢&#xff1f;为了解决这个问题&#xff0c;我们搜索并测试了不同的应用程序&#xff0c;然后总结了本指南中分享的 9 个有效选项。您可…

生成JavaDoc文档

生成 JavaDoc 文档 1、快速生成 文档 注解 2、常见的文档注解 3、脚本生成 doc 文档 4、IDEA工具栏生成 doc 文档 第一章 快速入门 第01节 使用插件 在插件工具当中&#xff0c;找到插件 javaDoc 使用方式&#xff0c;在代码区域&#xff0c;直接点击右键。选择 第02节 常用注…

Web后端基础(Maven基础)

https://blog.csdn.net/q20202828/article/details/148459525?spm1001.2014.3001.5501 这是我总结了一下aliyun私服maven依赖配置Maven 3.9.1下载安装的操作 Maven的作用 统一项目结构 Maven 还提供了标准、统一的项目结构 。 1). 未使用Maven 由于java的开发工具呢&#x…

set map数据结构

#include <set> #include <iostream> using namespace std;int main() {// 设置控制台输出编码为UTF-8system("chcp 65001");set<int> s1; // 创建一个整数集合// 插入元素s1.insert(5);s1.insert(3);s1.insert(7);s1.insert(1);s1.insert(9);//默…

面试题小结(真实面试)

面试题 1.call与apply的区别2.vue3的响应式原理3.js的垃圾回收机制4.说说原型链5.什么是防抖和节流6.说一下作用域链7.在一个页面加载数据时&#xff08;还没加载完成&#xff09;&#xff0c;切换到另一个页面&#xff0c;怎么暂停之前页面的数据加载。 浏览器自动中止机制 这…

计算机网络领域所有CCF-A/B/C类期刊汇总!

本期小编统计了【计算机网络】领域CCF推荐所有期刊的最新影响因子&#xff0c;分区、年发文量以及投稿经验&#xff0c;供大家参考&#xff01; CCF-A类 1 IEEE Journal on Selected Areas in Communications 【影响因子】13.8 【期刊分区】JCR1区&#xff0c;中科院1区TOP …

有意向往gis开发靠,如何规划学习?

听说GIS开发工资不错、还不像互联网那么卷&#xff1f;心动了&#xff1f;但一看那些“WebGL”、“空间分析”、“OGC规范”的词儿就头大&#xff1f;别急&#xff01; 今天咱就聊聊零基础/转行选手&#xff0c;咋规划学习GIS开发这条路。不整高大上&#xff0c;就讲实在的&am…

五、查询处理和查询优化

五、查询处理和查询优化 主要内容 查询概述查询处理过程关系操作的基本实现算法查询优化技术代数优化基于存取路径的优化基于代价估算的优化 1. 查询概述 查询是数据库管理系统中使用最频繁、最基本的操作&#xff0c;对系统性能有很大影响。 对于同一个SQL查询&#xff0c…

缓解骨质疏松 —— 补钙和补维 D

骨质老化/疏松原理&#xff08;机制&#xff09;骨密度下降与骨小梁结构退化局部受压导致的微损伤或压力集中 诊断要点治疗策略吃什么食物能补钙呢&#xff1f;钙片吃什么食物能补维生素 D 呢&#xff1f; 骨质老化/疏松 骨质老化&#xff08;常指骨密度下降或骨质疏松&#x…

《PMBOK® 指南》第八版草案重大变革:6 大原则重构项目管理体系

项目管理领域的权威指南迎来关键升级&#xff01;PMI 最新发布的《PMBOK 指南》第八版草案引发行业广泛关注&#xff0c;此次修订首次将项目管理原则浓缩为 6 大黄金法则&#xff0c;重构 7 大绩效域&#xff0c;并首度公开过程组与绩效域的映射关系。本文将全面解析新版核心变…

Ctrl+R 运行xxx.exe,发现有如下问题.

CtrlR 运行xxx.exe,发现有如下问题. (1)找不到Qt5Core.all,Qt5Cored.dll,Qt5Gui.dll,Qt5Guid.dll,Qt5Widgets.all,Qt5Widgetsd.dll? (2)之后找不到libwinpthread-1.dll 从这个目录拷贝相应的库到运行xx.exe目录下 方法二:将库路径添加到系统PATH环境变量里: 在Path中添加路…

极智项目 | 基于PyQT+Whisper实现的语音识别软件设计

这是一个基于OpenAI的Whisper模型的语音识别应用程序&#xff0c;使用PyQt5构建了简洁直观的用户界面。该应用支持多语言识别&#xff0c;特别优化了中文识别体验。 项目下载&#xff1a;链接 功能特点 简洁现代的深色主题界面支持多语言识别&#xff08;中文、英语、日语等…

vue+cesium示例:地形开挖(附源码下载)

基于cesium和vue绘制多边形实现地形开挖效果&#xff0c;适合学习Cesium与前端框架结合开发3D可视化项目。 demo源码运行环境以及配置 运行环境&#xff1a;依赖Node安装环境&#xff0c;demo本地Node版本:推荐v18。 运行工具&#xff1a;vscode或者其他工具。 配置方式&#x…

升级:用vue canvas画一个能源监测设备和设备的关系监测图!

用vue canvas画一个能源电表和设备的监测图-CSDN博客 上一篇文章&#xff0c;我是用后端的数据来画出监测图。这次我觉的&#xff0c;用前端来控制数据&#xff0c;更爽。 本期实现功能&#xff1a; 1&#xff0c;得到监测设备和设备的数据&#xff0c;然后进行存库 2&…

深入理解 transforms.Normalize():PyTorch 图像预处理中的关键一步

深入理解 transforms.Normalize()&#xff1a;PyTorch 图像预处理中的关键一步 在使用 PyTorch 进行图像分类、目标检测等深度学习任务时&#xff0c;我们常常会在数据预处理部分看到如下代码&#xff1a; python复制编辑transform transforms.Compose([transforms.ToTensor…

爆炸仿真的学习日志

今天学习了一下【Workbench LS-DYNA中炸药在空气中爆炸的案例-哔哩哔哩】 https://b23.tv/kmXlN29 一开始 如果你的 ANSYS Workbench 工具箱&#xff08;Toolbox&#xff09;里 只有 SPEOS&#xff0c;即使尝试了 右键刷新、重置视图、显示全部 等方法仍然没有其他分析系统&a…

[华为eNSP] OSPF综合实验

目录 配置流程 画出拓扑图、标注重要接口IP 配置客户端IP 配置服务端IP 配置服务器服务 配置路由器基本信息&#xff1a;名称和接口IP 配置路由器ospf协议 测试结果 通过配置OSPF路由协议&#xff0c;实现跨多路由器的网络互通&#xff0c;并验证终端设备的访问能力。 …

完美搭建appium自动化环境

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 桌面版appium提供可视化操作appium主要功能的使用方式&#xff0c;对于初学者非常适用。 如何在windows平台安装appium桌面版呢&#xff0c;大体分两个步骤&…