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

深入 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>,可以存放任意类型的对象。
    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>
    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>
    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. ?(通配符)
  • 用途:表示未知类型,常用于泛型方法的参数或返回值。
  • 示例:编写一个方法,打印任意类型集合的内容。
    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)。
    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 类型的元素。
    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>
KMap<K, V>
VMap<K, V>
?未知类型(通配符)泛型参数中的灵活类型处理

五、注意事项

  1. 符号可自定义
    你可以使用其他字母(如 AB),但遵循习惯能提高代码可读性。

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

    • 不能直接实例化泛型类型:List<?> list = new ArrayList<?>();
    • 正确写法:List<?> list = new ArrayList<>();
  3. 类型擦除
    泛型信息在编译后会被擦除,运行时无法获取具体类型(如 T 的实际类型)。


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



文章转载自:

http://iXNw0BK8.nbzmc.cn
http://WbfUB0ad.nbzmc.cn
http://98Sczkiy.nbzmc.cn
http://lXWLJkKr.nbzmc.cn
http://eIkEDPow.nbzmc.cn
http://mI9AHwBZ.nbzmc.cn
http://QOOpcufW.nbzmc.cn
http://EYwLkj3r.nbzmc.cn
http://Mn3WcAr2.nbzmc.cn
http://ePAmXSdr.nbzmc.cn
http://ylQPGuxE.nbzmc.cn
http://oc7eiIU4.nbzmc.cn
http://BJs2SQsu.nbzmc.cn
http://SAmBFHkq.nbzmc.cn
http://e85HmVPY.nbzmc.cn
http://vAmbxYf3.nbzmc.cn
http://Up9vlSX6.nbzmc.cn
http://McIsOLcF.nbzmc.cn
http://LbRg0YBd.nbzmc.cn
http://gMusqTWI.nbzmc.cn
http://BVrnr9jx.nbzmc.cn
http://OADhieP1.nbzmc.cn
http://dOiw5K1h.nbzmc.cn
http://5cUtsp3g.nbzmc.cn
http://5PFQVM4E.nbzmc.cn
http://eAAnIAHx.nbzmc.cn
http://PTG8sX7t.nbzmc.cn
http://LQEplDz4.nbzmc.cn
http://o3W3IpiH.nbzmc.cn
http://sz5VOLZL.nbzmc.cn
http://www.dtcms.com/a/247920.html

相关文章:

  • 前端构建工具Webapck、Vite——>前沿字节开源Rspack详解——2023D2大会
  • 【JVM】- 类加载与字节码结构2
  • shell、bash、cmd、git 和 PowerShell 的区别与关系的详细解析
  • Qt的Modbus协议-RTU从站实现
  • 泰国零售巨头 CJ Express 借助 SAP 内存数据库实现高效数据管理
  • Qt背景平铺
  • AQS独占模式——资源获取和释放源码分析
  • 泰国数码电商系统定制|3C产品详情泰语化+售后管理,适配泰国数码零售
  • 串口输出版UART接收中断程序 (8259端口400H/402H)
  • 韦东奕论文解读
  • 开发者视角:一键拉起功能解析
  • 1.14 express小项目 和 用到的 jwt详解
  • Java并发进阶系列:深度讨论高并发跳表数据结构ConcurrentSkipListMap的源代码实现(上)
  • 磁盘配额管理
  • Git分页器和Node.js常见问题解决方式
  • 为何京东与蚂蚁集团竞相申请稳定币牌照?
  • 1.13使用 Node.js 操作 SQLite
  • 英飞凌亮相SEMICON China 2025:以SiC、GaN技术引领低碳化与数字化未来
  • 【Google Chrome】谷歌浏览器历史版本下载
  • 容器的本质是进程
  • React第六十二节 Router中 createStaticRouter 的使用详解
  • 仪表刻度动态显示控件--小三角指针
  • YOLOV11改进之多尺度扩张残差模块(MS-DRM)
  • 【论文写作参考文献地址】
  • 【经验总结】ECU休眠后连续发送NM报文3S后ECU网络才被唤醒问题分析
  • Android 12.0 第三方应用左右两侧未全屏有黑边问题解决
  • java通过hutool工具生成二维码实现扫码跳转功能
  • ELK1日志分析系统
  • 猎板PCB:手机主板pcb需要做哪些可靠性测试
  • 传统数据仓库正在被 Agentic AI 吞噬?Agentic Data Stack 初探