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.pswp.cn/pingmian/83879.shtml

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

相关文章

Komiko 视频到视频功能炸裂上线!

Komiko 平台作为行业的创新先锋&#xff0c;近日宣布推出全新的视频到视频&#xff08;Video-to-Video&#xff09;功能&#xff0c;这一举措犹如一颗重磅炸弹&#xff0c;瞬间在漫画、动画和插画创作的世界里掀起了惊涛骇浪&#xff0c;进一步巩固了其作为 AI 驱动的一体化创作…

Protobuf 中的类型查找规则

a.proto syntax "proto2"; //protoc3生成代码兼容proto2语法 package pkgA; message Example { }ba.proto package pkgB.pkgA; message Example { }b.proto syntax "proto3"; //protoc3生成代码兼容proto2语法 package pkgB; import "test1/a.pr…

KMeans 算法深度解析:从原理到实战

一、算法概述&#xff1a;无监督学习的聚类利器​ 在机器学习的无监督学习领域&#xff0c;聚类算法是探索数据内在结构的重要工具。KMeans 算法作为划分式聚类的代表&#xff0c;因其简单高效的特性&#xff0c;成为数据科学家工具箱中的必备技能。该算法通过将 n 个数据点划…

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…

Server2003 B-1 Windows操作系统渗透

任务环境说明&#xff1a; 服务器场景&#xff1a;Server2003&#xff08;开放链接&#xff09; 服务器场景操作系统&#xff1a;Windows7 1.通过本地PC中渗透测试平台Kali对服务器场景Windows进行系统服务及版本扫描渗透测试&#xff0c;并将该操作显示结果中Telnet服务对应的…

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…

使用React+ant Table 实现 表格无限循环滚动播放

数据大屏表格数据&#xff0c;当表格内容超出&#xff08;出现滚动条&#xff09;时&#xff0c;无限循环滚动播放&#xff0c;鼠标移入暂停滚动&#xff0c;鼠标移除继续滚动&#xff1b;数据量小没有超出时不需要滚动。 *使用时应注意&#xff0c;滚动区域高度父元素高度 - 表…

机器人现可完全破解验证码:未来安全技术何去何从?

引言 随着计算机视觉技术的飞速发展&#xff0c;机器学习模型现已能够100%可靠地解决Google的视觉reCAPTCHAv2验证码。这标志着一个时代的结束——自2000年代初以来&#xff0c;CAPTCHA&#xff08;"全自动区分计算机与人类的图灵测试"的缩写&#xff09;一直是区分…

大模型安全测试报告:千问、GPT 全系列、豆包、Claude 表现优异,DeepSeek、Grok-3 与 Kimi 存在安全隐患

大模型安全测试报告&#xff1a;千问、GPT 全系列、豆包、Claude 表现优异&#xff0c;DeepSeek、Grok-3 与 Kimi 存在安全隐患 引言 随着生成式人工智能技术的快速演进&#xff0c;大语言模型&#xff08;LLM&#xff09;正在广泛应用于企业服务、政务系统、教育平台、金融风…

docker 部署redis集群 配置

docker的网络模式 网桥模式每次重启容器都有可能导致容器ip地址变化&#xff0c;需要固定ip的自己自定义网络&#xff0c;这里介绍的是默认网络模式 docker创建容器 docker run --name redis6379 -p 6379:6379 -p 16379:16379 -v /etc/redis/redis6379:/etc/redis -d --r…

LabVIEW的AMC架构解析

此LabVIEW 程序基于消息队列&#xff08;Message Queue&#xff09;机制构建 AMC 架构&#xff0c;核心包含消息生成&#xff08;MessageGenerator &#xff09;与消息处理&#xff08;Message Processor &#xff09;两大循环&#xff0c;通过队列传递事件与指令&#xff0c;实…

数据库管理与高可用-MySQL主从复制与读写分离

目录 #1.1MySQL主从复制原理 1.1.1MySQL支持的复制类型 1.1.2复制的工作过程 #2.1MySQL读写分离原理 2.1.1常见的MySQL读写分离为为两种 #3.1主从复制读写分离的实验案例 1.1MySQL主从复制的原理 MySQL 主从复制是一种常用的数据同步机制&#xff0c;用于将主数据库&#xf…

Python60日基础学习打卡Day45

之前的神经网络训练中&#xff0c;为了帮助理解借用了很多的组件&#xff0c;比如训练进度条、可视化的loss下降曲线、权重分布图&#xff0c;运行结束后还可以查看单张图的推理效果。 如果现在有一个交互工具可以很简单的通过按钮完成这些辅助功能那就好了&#xff0c;他就是…

React项目的状态管理:Redux Toolkit

目录 1、搭建环境 2、Redux Toolkit 包含了什么 3、使用示例 &#xff08;1&#xff09;创建user切片 &#xff08;2&#xff09;合并切片得到store &#xff08;3&#xff09;配置store和使用store 使用js来编写代码&#xff0c;方便理解一些 1、搭建环境 首先&#xf…

父组件prop传向子组件的值,被子组件直接v-model绑定 功能不生效

隐式修改组件属性会导致功能异常 实际操作中发现&#xff0c;即便是父组件把简单数据通过prop传给了子组件&#xff0c;子组件再使用v-model绑定&#xff0c;也不行&#xff0c;响应式还是对异常 原vue2业务中存在组件定义某个类型为Object的属性&#xff0c;然后将该属性对象…

c#bitconverter操作,不同变量类型转byte数组

缘起:串口数据传输的基础是byte数组&#xff0c;write(buff,0,num)或者writeline(string)&#xff0c;如果是字符串传输就是string变量就可以了&#xff0c;但是在modbus这类hex传递时&#xff0c;就要遇到转换了&#xff0c;拼凑byte数组时需要各种变量的值传递&#xff0c;解…

【Redis】set 类型

set 一. set 类型介绍二. set 命令sadd、smembers、sismemberscard、spop、srandmembersmove、srem集合间操作交集&#xff1a;sinter、sinterstore并集&#xff1a;sunion、sunionstore差集&#xff1a;sdiff、sdiffstore 三. set 命令小结四. set 内部编码方式五. set 使用场…

02-Redis常见命令

02-Redis常见命令 Redis数据结构介绍 Redis是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;不过value的类型多种多样&#xff1a; 贴心小建议&#xff1a;命令不要死记&#xff0c;学会查询就好啦 Redis为了方便学习&#xff0c;将操作不同数据类型的命…

Rk3568驱动开发_GPIO点亮LED_12

需求&#xff1a; 用配置寄存器方式控制点灯非常原始&#xff0c;现在采用更方便的Linux提供的pctrl和gpio子系统编写字符驱动 1.设备树配置&#xff1a; 现将开发板中呼吸灯关闭掉防止占用到我需要使用的引脚 /* Narnat 2025-5-29 RK3568 GPIO 无需设置pinctrl*/gpioled{co…

阿里云ACP云计算备考笔记 (3)——云存储RDS

目录 第一章 云存储概览 1、云存储通用知识 ① 发展历史 ② 云存储的优势 2、云存储分类 3、文件存储业务场景 第二章 块存储 1、块存储分类 2、云盘的优势 3、创建云盘 4、管理数据盘 ① 格式化数据盘 ② 挂载数据盘 ③ 通过 API 挂载云盘 5、管理系统盘 ① 更…