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

JavaSE核心知识点02面向对象编程02-07(枚举)

🤟致敬读者

  • 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉

📘博主相关

  • 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息

文章目录

  • ## JavaSE核心知识点02面向对象编程02-07(枚举)
      • **一、泛型存在的意义**
      • **二、泛型核心语法**
      • **三、类型通配符**
      • **四、类型擦除与限制**
      • **五、泛型高级应用**
      • **六、最佳实践与常见错误**
      • **七、学习建议**


📃文章前言

  • 🔷文章均为学习工作中整理的笔记。
  • 🔶如有错误请指正,共同学习进步。

## JavaSE核心知识点02面向对象编程02-07(枚举)

以下是关于Java泛型的详细讲解,从基础概念到实际应用逐步展开:


一、泛型存在的意义

1.1 类型安全

// 泛型出现前的集合使用(JDK1.5之前)
List list = new ArrayList();
list.add("Hello");
list.add(100); // 编译通过,运行时可能抛出ClassCastExceptionString str = (String) list.get(1); // 运行时报错:Integer无法转String

1.2 代码复用
通过泛型实现通用容器:

// 泛型类定义
public class Box<T> {private T content;public void set(T content) { this.content = content; }public T get() { return content; }
}// 使用时指定具体类型
Box<String> stringBox = new Box<>();
Box<Integer> intBox = new Box<>();

二、泛型核心语法

2.1 泛型类

// 多类型参数示例
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);

2.2 泛型方法

// 独立于类的泛型方法
public class Utils {public static <T> void printArray(T[] array) {for (T element : array) {System.out.print(element + " ");}System.out.println();}
}// 调用示例
Integer[] intArr = {1, 2, 3};
Utils.<Integer>printArray(intArr); // 显式指定类型
Utils.printArray(new String[]{"A", "B"}); // 自动类型推断

2.3 泛型接口

// 泛型接口定义
public interface Generator<T> {T generate();
}// 实现类指定具体类型
class StringGenerator implements Generator<String> {@Overridepublic String generate() {return UUID.randomUUID().toString();}
}

三、类型通配符

3.1 上界通配符(<? extends T>)

// 接收Number及其子类集合
public static double sum(List<? extends Number> list) {double sum = 0;for (Number num : list) {sum += num.doubleValue();}return sum;
}// 可以传入List<Integer>或List<Double>
List<Integer> ints = Arrays.asList(1,2,3);
System.out.println(sum(ints)); // 输出6.0

3.2 下界通配符(<? super T>)

// 向集合中添加元素
public static void addNumbers(List<? super Integer> list) {for (int i = 1; i <= 5; i++) {list.add(i);}
}List<Number> numbers = new ArrayList<>();
addNumbers(numbers); // 合法操作

3.3 无界通配符(<?>)

// 仅需遍历集合元素时不关心类型
public static void printList(List<?> list) {for (Object elem : list) {System.out.print(elem + " ");}System.out.println();
}

四、类型擦除与限制

4.1 类型擦除原理
编译后泛型类型会被擦除为原始类型:

// 编译前
List<String> list = new ArrayList<>();// 编译后(字节码层面)
List list = new ArrayList();

4.2 泛型限制

  • 无法实例化类型参数
public class Box<T> {// 错误写法private T instance = new T(); // 正确方式通过反射(需谨慎)public T createInstance(Class<T> clazz) throws Exception {return clazz.newInstance();}
}
  • 无法使用基本类型
// List<int> list; // 编译错误
List<Integer> list; // 正确
  • 静态成员不能使用类型参数
public class Box<T> {// static T staticField; // 错误
}

五、泛型高级应用

5.1 泛型与反射

public class GenericFactory<T> {private Class<T> type;public GenericFactory(Class<T> type) {this.type = type;}public T createInstance() throws Exception {return type.getDeclaredConstructor().newInstance();}
}// 使用示例
GenericFactory<StringBuilder> factory = new GenericFactory<>(StringBuilder.class);
StringBuilder sb = factory.createInstance();

5.2 泛型数组

// 正确创建泛型数组的方式
public class ArrayMaker<T> {private Class<T> kind;public ArrayMaker(Class<T> kind) {this.kind = kind;}@SuppressWarnings("unchecked")T[] create(int size) {return (T[]) Array.newInstance(kind, size);}
}// 使用示例
ArrayMaker<String> maker = new ArrayMaker<>(String.class);
String[] strArray = maker.create(10);

六、最佳实践与常见错误

6.1 PECS原则(Producer Extends, Consumer Super)

// 正确使用示例
public static <T> void copy(List<? super T> dest, List<? extends T> src) {for (T item : src) {dest.add(item);}
}List<Number> dest = new ArrayList<>();
List<Integer> src = Arrays.asList(1,2,3);
copy(dest, src); // 正确执行

6.2 常见错误示例

// 错误1:类型不匹配
List<String> list = new ArrayList<Object>(); // 编译错误// 错误2:原始类型警告
List rawList = new ArrayList<String>(); // 编译警告
rawList.add(100); // 运行时可能出错

七、学习建议

  1. 实践路线

    • 从集合框架(如ArrayList)开始体验泛型
    • 尝试自定义泛型类(如实现一个通用缓存类)
    • 研究JDK源码中的泛型应用(如Comparable接口)
  2. 调试技巧

    • 使用javac -Xlint:unchecked查看未检查警告
    • 在IDE中观察类型擦除后的字节码
  3. 延伸学习

    • 泛型与设计模式(如工厂模式、策略模式)
    • Java8后的改进(如泛型类型推断增强)
    • Kotlin/Scala等JVM语言的泛型特性对比

通过系统学习和大量编码实践,通常可在2-3周内掌握泛型的核心用法。理解难点时,建议通过绘制类型关系图辅助记忆(如通配符的继承关系)。


📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

http://www.xdnf.cn/news/5378.html

相关文章:

  • 【Bootstrap V4系列】学习入门教程之 组件-巨幕(Jumbotron)和列表组(List group)
  • 常用的rerank模型有哪些?都有什么优势?
  • Python 自动化脚本开发秘籍:从入门到实战进阶(6/10)
  • 螺旋驱动管道机器人的结构设计
  • OpenWrt开发第7篇:OpenWrt配置支持Web界面
  • 网址为 http://xxx:xxxx/的网页可能暂时无法连接,或者它已永久性地移动到了新网址
  • Linux共享内存深度解析:从内核机制到云原生应用
  • DAY 17 训练
  • 基于Dockers的Bitwarden的私有本地部署
  • 动态规划之二维费用的背包问题解析
  • CDGP历次主观题真题回忆
  • 深入浅出之STL源码分析4_类模版
  • Bitacora:基因组组件中基因家族识别和注释的综合工具
  • PTA:jmu-ds-拓扑排序
  • 安装:Kali2025+Docker
  • 【Redis】string 字符串
  • RT-Thread 深入系列 Part 4:组件包管理与软件框架
  • CarConfig自动化测试思路(CCP)
  • MiInsertVad函数分析之nt!MMVAD结构
  • make和makefile的使用,以及写一个简单的进度条程序
  • Yocto是如何使用$D目录来构建文件系统的?
  • SAM详解3.2(关于2和3的题)
  • 从客厅到星空 | 解锁雷克赛恩 Cyber Pro1 投影仪的多元场景应用与选购指南
  • Baklib革新企业数字化内容管理
  • idea批量引入缺失的和去除无用的类包
  • cmake source_group 分组功能辅助函数
  • 焊接与热切割作业理论考试难度分析
  • 未来通信中的大型人工智能模型:基础、应用与挑战的全面综述
  • 《P2415 集合求和》
  • Windows 操作系统 - BAT 脚本引入(BAT 脚本初识、窗口标题与颜色、输出文本)