泛型是Java中通过类型参数实现类型安全和代码复用的机制,它允许在定义类、接口或方法时使用类型占位符(如T),从而避免强制类型转换和运行时类型错误。例如,使用List后只能添加String类型元素,编译器提前检查类型合法性,防止ClassCastException。自定义泛型类如Box可封装任意类型值,泛型方法如 void print(T item)可接受任何类型参数并由编译器自动推断。通配符?配合上界限定(? extends T)和下界限定(? super T)支持更灵活的类型控制,遵循PECS原则(生产者使用extends,消费者使用super)。Java泛型基于类型擦除,即编译后泛型信息消失,运行时无具体类型记录,因此不支持创建泛型数组(如new T[])、不能使用基本数据类型作泛型参数(需用包装类),且静态变量不能引用类的泛型参数。掌握泛型需理解其核心是编译期类型检查,结合集合与自定义实例练习可快速上手。

泛型是Java中一个非常重要的特性,它的核心目的是让类型(类、接口、方法)在定义时可以操作“类型参数”,从而提升代码的可重用性和类型安全性。简单来说,泛型就是让类或方法能适用于多种类型,同时避免强制类型转换和运行时错误。
什么是泛型?
在没有泛型之前,我们经常使用Object来表示任意类型。比如ArrayList只能存储Object,当我们从中取出元素时,必须进行强制类型转换,而且容易出错:
问题示例:
List list = new ArrayList();list.add("Hello");
String s = (String) list.get(0); // 需要强转
// 如果不小心放入Integer,取出来强转成String就会抛出ClassCastException
泛型解决了这个问题。通过在定义集合时指定具体类型,编译器就能提前检查类型是否正确:
立即学习“Java免费学习笔记(深入)”;
Listlist.add("Hello"); // 只能添加String
String s = list.get(0); // 不需要强转,直接是String类型
如果尝试加入非String类型,比如list.add(123),编译器会直接报错,避免了运行时异常。
泛型类与泛型方法
你可以自己定义使用泛型的类和方法。泛型通过类型参数(通常用T、E、K、V等表示)实现。
泛型类示例: public class Boxprivate T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
使用时指定类型:
媒体包提供了可管理各种媒体类型的类。这些类可提供用于执行音频和视频操作。除了基本操作之外,还可提供铃声管理、脸部识别以及音频路由控制。本文说明了音频和视频操作。 本文旨在针对希望简单了解Android编程的初学者而设计。本文将指导你逐步开发使用媒体(音频和视频)的应用程序。本文假定你已安装了可开发应用程序的Android和必要的工具,同时还假定你已熟悉Java或掌握面向对象的编程概念。感兴趣的朋友可以过来看看
stringBox.set("abc");
String content = stringBox.get();
System.out.println(item);
}
这个方法可以接受任何类型的参数,调用时无需指定类型,编译器会自动推断。
通配符与边界限制
泛型还支持更灵活的类型控制,比如使用通配符?、上界? extends T和下界? super T。
常见场景:- List>:表示未知类型的列表,只能读取为Object
- List extends Number>:可以是Number或其子类(如Integer、Double),适合“生产者”角色
- List super Integer>:可以是Integer或其父类(如Number、Object),适合“消费者”角色
这种设计遵循PECS原则(Producer-Extends, Consumer-Super),帮助你在复杂集合操作中正确使用泛型。
类型擦除与注意事项
Java泛型是通过“类型擦除”实现的,也就是说,泛型信息在编译后会被擦除,运行时并不知道具体的泛型类型。例如List
- 不能创建泛型数组,如new T[]是非法的
- 不能用基本类型作为泛型参数(要用Integer而不是int)
- 静态变量不能使用类的泛型参数
理解这些限制有助于避免编译错误和运行时陷阱。
基本上就这些。泛型的本质是把类型当作参数传递,在编码阶段由编译器做类型检查,既保证安全又减少重复代码。多写几个自定义泛型类,再结合集合类的使用,很快就能掌握。不复杂但容易忽略细节。









