深入 Java 泛型:基础应用与实战技巧

在 Java 泛型中,TEKV? 是常见的占位符符号,它们本质上没有区别,只是命名习惯不同,用于提高代码可读性。以下是详细解释和案例:


一、符号的常见含义

符号 典型用途 示例场景
T 通用类型(Type) 泛型类、泛型方法的通用类型占位符
E 集合元素(Element) 集合类(如 List<E>Set<E>
K 键(Key) 键值对中的键(如 Map<K, V>
V 值(Value) 键值对中的值(如 Map<K, V>
? 通配符(Wildcard) 表示未知类型(如 List<?>

二、具体案例解析

1. T(通用类型)
  • 用途:表示任意类型,常见于泛型类或泛型方法。

  • 示例 :定义一个泛型类 Box<T>,可以存放任意类型的对象。

    java 复制代码
    public class Box<T> {
        private T content;
        
        public void setContent(T content) {
            this.content = content;
        }
        
        public T getContent() {
            return content;
        }
    }
    
    // 使用示例
    Box<String> stringBox = new Box<>();
    stringBox.setContent("Hello");
    Box<Integer> intBox = new Box<>();
    intBox.setContent(100);

2. E(集合元素)
  • 用途:表示集合中的元素类型,常见于集合类。

  • 示例 :自定义一个简单的集合类 MyList<E>

    java 复制代码
    public class MyList<E> {
        private E[] elements;
        
        public void add(E element) { /* 添加元素 */ }
        public E get(int index) { /* 获取元素 */ }
    }
    
    // 使用示例
    MyList<String> list = new MyList<>();
    list.add("Java");
    String element = list.get(0);

3. KV(键值对)
  • 用途 :表示键值对的键和值类型,常见于 Map 类。

  • 示例 :自定义一个泛型键值对类 Pair<K, V>

    java 复制代码
    public class Pair<K, V> {
        private K key;
        private V value;
        
        public Pair(K key, V value) {
            this.key = key;
            this.value = value;
        }
        
        public K getKey() { return key; }
        public V getValue() { return value; }
    }
    
    // 使用示例
    Pair<String, Integer> pair = new Pair<>("Age", 25);
    String key = pair.getKey();    // "Age"
    int value = pair.getValue();   // 25

4. ?(通配符)
  • 用途:表示未知类型,常用于泛型方法的参数或返回值。

  • 示例 :编写一个方法,打印任意类型集合的内容。

    java 复制代码
    public void printList(List<?> list) {
        for (Object item : list) {
            System.out.println(item);
        }
    }
    
    // 使用示例
    List<String> strings = Arrays.asList("A", "B", "C");
    List<Integer> numbers = Arrays.asList(1, 2, 3);
    printList(strings);  // 输出 A, B, C
    printList(numbers);  // 输出 1, 2, 3

三、通配符 ? 的进阶用法

1. 上界通配符 <? extends T>
  • 用途 :表示类型是 T 或其子类。

  • 示例 :处理数字集合(如 IntegerDouble)。

    java 复制代码
    public double sum(List<? extends Number> numbers) {
        double sum = 0;
        for (Number num : numbers) {
            sum += num.doubleValue();
        }
        return sum;
    }
    
    // 使用示例
    List<Integer> integers = Arrays.asList(1, 2, 3);
    List<Double> doubles = Arrays.asList(1.1, 2.2, 3.3);
    System.out.println(sum(integers));  // 6.0
    System.out.println(sum(doubles));   // 6.6
2. 下界通配符 <? super T>
  • 用途 :表示类型是 T 或其父类。

  • 示例 :向集合中添加 T 类型的元素。

    java 复制代码
    public void addNumbers(List<? super Integer> list) {
        list.add(1);
        list.add(2);
    }
    
    // 使用示例
    List<Number> numbers = new ArrayList<>();
    addNumbers(numbers);  // 可以添加 Integer 到 Number 集合

四、符号的命名习惯总结

符号 含义 典型场景
T 通用类型 泛型类、泛型方法
E 集合元素 List<E>Set<E>
K Map<K, V>
V Map<K, V>
? 未知类型(通配符) 泛型参数中的灵活类型处理

五、注意事项

  1. 符号可自定义

    你可以使用其他字母(如 AB),但遵循习惯能提高代码可读性。

    java 复制代码
    public class MyGeneric<A, B> { /* ... */ }  // 合法但不推荐
  2. 通配符 ? 的限制

    • 不能直接实例化泛型类型:List<?> list = new ArrayList<?>();
    • 正确写法:List<?> list = new ArrayList<>();
  3. 类型擦除

    泛型信息在编译后会被擦除,运行时无法获取具体类型(如 T 的实际类型)。


通过以上案例,可以清晰理解不同符号的用途和区别!


相关推荐
来两个炸鸡腿14 分钟前
【Datawhale2607】llm-algo-leetcode task02 基础算子
人工智能·python·大模型
阿里云云原生15 分钟前
Agent 不再是“玩具”!AgentScope Java 2.0 GA 发布:构建企业级分布式智能体底座
java·开发语言·分布式·agentscope
41541115 分钟前
MyBatis-Plus + PostGIS 实战(四):GeoJSON 序列化与前端地图对接,全局 WKT + 局部 GeoJSON,两种格式优雅共存
java·mybatis·postgis·geojson
峥嵘life30 分钟前
Andorid 打开热点,关闭有线网,ifconfig卡死分析解决
java·服务器·网络
HillVue37 分钟前
Token 叙事退潮,DAA 重新定义 AI 价值标准
java·人工智能·eclipse
行者全栈架构师41 分钟前
【码动四季】Spring Boot 可观测性体系:Micrometer + OpenTelemetry + Grafana 全链路搭建
java·算法·架构
庵中十三居士41 分钟前
【纯AI无人工修改】AI Agent从0到1实战:50行Python手写核心循环,一次看懂所有Agent框架的底层逻辑
开发语言·人工智能·python
TDengine (老段)1 小时前
TDengine JOIN 完整语法 — Inner/Outer/ASOF/Window 全语法详解
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
天天爱吃肉82181 小时前
# 商用车多体动力学整车仿真学习笔记(开篇总览)
人工智能·笔记·python·功能测试·学习·汽车
Allen说改装1 小时前
2025 APAxpo佛山改装展的展出规模达到了多少平方米?
人工智能·python