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 复制代码
public class Box<T> {
    private T content;

    public void set(T t) {
        this.content = t;
    }

    public T get() {
        return content;
    }
}

用的时候:

java 复制代码
Box<String> stringBox = new Box<>();
stringBox.set("你好");

Box<Integer> intBox = new Box<>();
intBox.set(100);

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

E → Element(元素)

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

java 复制代码
public interface List<E> {
    boolean add(E e);
    E get(int index);
}

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

比如:

java 复制代码
List<String> list = new ArrayList<>();
// 这里的String,就是E

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

K和V = Key和Value

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

java 复制代码
public interface Map<K, V> {
    V put(K key, V value);
    V get(Object key);
}

K = Key,V = Value。

比如:

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

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

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

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

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

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

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

再举个例子

java 复制代码
List<?> list1 = new ArrayList<String>();
List<?> list2 = new ArrayList<Integer>();
// 都可以

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

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

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

3. 这里还有一种情况

错误写法:

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

正确写法:

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

总结

  • T:Type,通用类型,最常用
  • E:Element,集合里的元素
  • K:Key,Map的键
  • V:Value,Map的值
  • ?:问号,类型不确定

用多了就熟了。搞定收工。

我是大华,专注分享前后端开发的实战笔记。关注我,少走弯路,一起进步!

📌往期精彩

《Elasticsearch 太重?来看看这个轻量级的替代品 Manticore Search》

《别再if套if了!Java中return的9种优雅写法》

《别学23种了!Java项目中最常用的6个设计模式,附案例》

《写给小公司前端的 UI 规范:别让页面丑得自己都看不下去》

《Vue3+TS设计模式:5个真实场景让你代码更优雅》

相关推荐
wuminyu4 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
callJJ5 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
wbs_scy6 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
jinanwuhuaguo7 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup8 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952368 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.8 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19438 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12218 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px9 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋