Java泛型基础与实战示例
124 浏览量
更新于2024-09-01
收藏 65KB PDF 举报
"Java不可不知的泛型使用示例代码,通过实例介绍Java泛型的基本应用,帮助学习和理解"
在Java编程中,泛型是一种强大的工具,它允许程序员在编写代码时指定容器(如集合)所容纳的数据类型,从而提高了代码的类型安全性和效率。在Java中,泛型主要应用于类、接口和方法,使得它们能够操作多种数据类型,而无需进行强制类型转换。以下是关于Java泛型的一些关键知识点和示例代码的解析:
1. 定义泛型类
泛型类允许我们创建具有参数化类型的类。例如,上述示例中的`MyArrayList`可以改写为泛型类:
```java
public class MyArrayList<T> {
private T[] elementData;
private int size = 0;
public MyArrayList(int capacity) {
elementData = (T[]) new Object[capacity];
}
public void add(T i) {
if (size == elementData.length) {
throw new IndexOutOfBoundsException("数组已满");
}
elementData[size++] = i;
}
public T get(int index) {
if (index < 0 || index > size - 1) {
throw new IndexOutOfBoundsException("超出范围");
}
return elementData[index];
}
// 其他方法...
}
```
这里,`<T>`是类型参数,代表一种未知的类型。当我们创建`MyArrayList`对象时,可以指定`T`的具体类型,如`MyArrayList<Integer>`。
2. 边界限定
在某些情况下,我们可能希望限制泛型的类型参数只能是某个类或其子类。例如,只接受`Number`类型的子类:
```java
public class MyArrayList<T extends Number> {
// 类体...
}
```
这样,`MyArrayList`只能存储`Number`或其子类的实例。
3. 无界通配符
如果我们想要一个方法可以处理任何类型的泛型对象,可以使用无界通配符`?`:
```java
public void printList(List<?> list) {
// 处理任意类型的列表
}
```
这里,`?`表示未知类型,但无法在方法内部添加元素到列表。
4. 有界通配符
有时候我们希望限制通配符的类型范围,可以使用有界通配符:
```java
public void printList(List<? extends Number> list) {
// 处理Number或其子类的列表
}
```
5. 类型擦除
由于Java的泛型是编译时的概念,因此在运行时会进行类型擦除。这意味着所有的泛型信息都会被移除,实际运行的字节码与非泛型版本相似。这解释了为什么我们可以将`List<String>`转换为`List<Object>`,因为它们在运行时都是`List`。
6. 类型推断
自Java 7开始,编译器支持类型推断,可以简化泛型代码的写作。例如,当创建一个泛型对象时,编译器可以根据上下文自动推断类型:
```java
MyArrayList<Integer> myArrayList = new MyArrayList<>(4);
```
7. 野蛮类型
为了避免类型安全,应尽量避免使用未指定类型的泛型,即所谓的“野蛮类型”(如`List list = new ArrayList();`)。虽然可以这样写,但会导致编译器警告,并且丧失了泛型的主要优点。
8. 泛型方法
泛型也可以用于定义方法,这样可以确保方法内部的操作符合指定的类型规则:
```java
public static <T> void swap(List<T> list, int i, int j) {
T temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
```
上述`swap`方法可以交换列表中任意位置的元素,而无需关心列表具体存储的类型。
通过理解和掌握这些泛型的使用,开发者可以编写出更加健壮、类型安全且易于维护的Java代码。在实际项目中,泛型广泛应用于集合框架,如`List`、`Set`和`Map`,极大地提高了代码的可读性和复用性。
2010-06-21 上传
2023-08-23 上传
2020-09-04 上传
2022-06-10 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
2020-08-30 上传
2020-12-21 上传
weixin_38642349
- 粉丝: 2
- 资源: 895
最新资源
- ncomatlab代码-EarlySpringOnset:评估21世纪的异常早春发作
- iODBC:开源的ODBC驱动程序管理器和SDK,可促进在linux,freebsd,unix和MacOS X平台上开发与数据库无关的应用程序
- sturcott3:我是一个非常好奇的人,开始了第二职业的开发。 随时打个招呼!
- pdf2pdf:通过将页面另存为图像并将图像的反转版本合并为一个PDF来反转提供的PDF文件的颜色
- search-user-list:演示
- 基于图像处理的手柄键位映射方案.zip
- 行业文档-设计装置-一种利用钢结构厂房柱间支撑制作的检修平台.zip
- copy-speed-test
- Druid(apache-druid-0.21.1-bin.tar.gz)
- pywikibot::robot:与MediaWiki API接口的Python库。 这是gerrit.wikimedia.org的镜像。 不要在此处提交任何补丁。 见https
- snaparound---adm-ui:控制您的 snaparound 用户数据
- ORAN:ORAN的尊重追踪机器人
- 基于协同过滤的中医书籍推荐系统,实现的基于user和item的协同过滤算法.zip
- SentimentAnalysis:基于字典的情感分析
- 电子行业周报:北水南下推动港股优质电子资产估值修复,看好代工设备封测功率景气度持续高涨.rar
- rpgmaster-realms