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

Java泛型符号T、E、K、V、?总混用?5分钟彻底讲透,别再搞错了!

兄弟们,你有没有这样过: 写代码时,看到别人用List<T>Map<K, V>,心里想:这T、E、K、V到底啥意思?能不能换成A、B、C??又是啥?问又不太好意思问…… 咱们直接进入主题。

1. 泛型是啥?

泛型:“类型占位符”。 比如你写个工具类,想让它既能处理String,也能处理Integer,咋办? 你总不能写两个方法吧?太麻烦! 这时候,泛型就来了。你先用个“代号”代替具体类型,等用的时候再告诉它“哦,这次是String”。

2. 那T、E、K、V是啥?有啥区别?

这些字母就是“代号”的约定写法。不是语法规定,是大家都用习惯了的规矩。 你非要写List<A>,语法也是OK的。但别人看了可能会懵。 所以,这几个代号可以看做是这几个意思:

T → Type(类型)

最最常见的,代表“任意类型”。使用场景:写一个通用方法或类,不知道具体类型。

java

体验AI代码助手

代码解读

复制代码

public class Box<T> { private T content; public void set(T t) { this.content = t; } public T get() { return content; } }

用的时候:

java

体验AI代码助手

代码解读

复制代码

Box<String> stringBox = new Box<>(); stringBox.set("你好"); Box<Integer> intBox = new Box<>(); intBox.set(100);

T就是个“占位符”,传String它就是String;传Integer它就是Integer

E → Element(元素)

一般用在集合里,表示“集合中的元素类型”。使用场景ListSet这些容器。

java

体验AI代码助手

代码解读

复制代码

public interface List<E> { boolean add(E e); E get(int index); }

JDK源码就是这么写的。E = Element,一看就知道是“里面装的东西”。

比如:

java

体验AI代码助手

代码解读

复制代码

List<String> list = new ArrayList<>(); // 这里的String,就是E

所以,ET没啥本质区别,但语义不同E强调的是“这是集合里的元素”。

K和V = Key和Value

这个最简单,专用于Map使用场景Map类、方法。

java

体验AI代码助手

代码解读

复制代码

public interface Map<K, V> { V put(K key, V value); V get(Object key); }

K = Key,V = Value。

比如:

java

体验AI代码助手

代码解读

复制代码

Map<String, Integer> map = new HashMap<>(); map.put("年龄", 18); // K是String,V是Integer

只要看到Map,基本就是K和V。

? → 通配符(问号,就是“不知道”)

这个最tricky,但其实也简单。使用场景:你不想限制类型,或者类型不重要。

比如,你写个方法,只想打印List的大小,不管里面是String还是Integer

java

体验AI代码助手

代码解读

复制代码

public void printSize(List<?> list) { System.out.println("大小:" + list.size()); }

这里的?表示任何类型都行(除了null),因为类型不确定。 但可以读,比如list.get(0),返回的是Object。

再举个例子

java

体验AI代码助手

代码解读

复制代码

List<?> list1 = new ArrayList<String>(); List<?> list2 = new ArrayList<Integer>(); // 都可以

还有一个变种:<? extends T><? super T>

  • <? extends Animal>:只要是Animal的子类都可以
  • <? super Dog>:只要是Dog的父类都可以

但日常用得少,?就是“我不关心你啥类型”。

3. 这里还有一种情况

错误写法:

java

体验AI代码助手

代码解读

复制代码

public class Container<T> { private List<T> items = new ArrayList<T>(); // 多此一举! }

正确写法:

java

体验AI代码助手

代码解读

复制代码

private List<T> items = new ArrayList<>(); // JDK7以后,<>就够了

总结

  • T:Type,通用类型,最常用
  • E:Element,集合里的元素
  • K:Key,Map的键
  • V:Value,Map的值
  • ?:问号,类型不确定
http://www.cnnetsun.cn/news/66372.html

相关文章:

  • 如何衡量推广效果(如投产比、转化率)?一位餐饮老板的实战自白
  • 程序员必看!万字长文详解大模型“深度研究“新范式,小白也能入门AI智能体开发!
  • 大模型安全威胁全解析,Agent架构设计避坑指南,小白必看
  • SMDJ45A单向 TVS瞬态抑制二极管 :3000W浪涌保护管 防雷击抗静电
  • Foundation 文本
  • Sui 主网升级至 V1.61.2
  • 25、Kubernetes 应用部署与管理实践
  • 31、容器化应用设计理念与实践
  • 如何评估LobeChat的加载速度与响应延迟?性能基准测试
  • 缓存与数据库一致性解决方案深度解析
  • 消息队列真仙:我的道念支持最终一致性
  • Spring Boot项目推送Gitee全流程(进阶)
  • Java毕设项目:基于Springboot大学校园自习室教室座位预约网站设计与实现基于springboot高校自习室预约系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • JAVA打造同城羽馆预约,一键畅享运动
  • 经验贴 | 科学制定招聘需求与预算:HR 必看的逻辑与实操要点
  • 经验贴 | AI 面试评估系统怎么用?HR 高效识人实操指南
  • 构建个性化AI助手:LobeChat会话管理功能深度使用技巧
  • 基于昇腾NPU的YOLOV8-seg c++部署
  • 26、深入探索脚本编程与系统安全基础
  • XSS漏洞有哪几种?DOM型XSS和反射型有什么区别?SQL注入原理又是什么?网安面试题常见问题一文详解
  • 压力扫描阀:并行校准技术,解锁多点压力测量新高度
  • PyTorch框架下运行Qwen3-32B的内存优化策略
  • 为什么说Qwen3-8B是学术研究的理想选择?实测报告出炉
  • java基础-PriorityQueue(优先队列)
  • Qwen3-14B模型量化压缩技术:降低GPU内存占用
  • 18、日期和时间的格式化、解析及时间区域的使用
  • VisionPro CogIPOneImageTool1 工具超详细解释(含内部功能全解析)
  • VisionPro CogIDTool 工具超深度详解(技术细节 + 实战配置版)
  • 让 BI 拥有‘领域大脑’:智能 BI 如何实现 AI 级精准数据查询
  • 提示工程架构师的战略规划:提示系统生命周期管理