6.4 泛型

系列 - JAVA集合
目录
本实验手册介绍了Java泛型的基本概念和应用,包括泛型类、泛型方法和泛型接口。通过三个任务,展示了如何使用泛型来解决不同类型数据的存储和处理问题,提高代码的复用性和可读性。
任务一:泛型类
小明在开发一个学生成绩管理系统,需要分别存储不同类型的成绩:
- Java课程要存储百分制分数(整数)
- 英语课程要存储等级(A、B、C、D)
- 体育课程要存储是否及格(布尔值)
我们之前学过的ArrayList、HashSet、HashMap等集合类都支持泛型。这意味着在创建集合时,我们可以指定集合中要存放的数据类型:
// 存放整数的集合
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(100); // √ 正确
numbers.add("abc"); // × 错误,不能存放字符串
// 存放字符串的集合
ArrayList<String> names = new ArrayList<>();
names.add("张三"); // √ 正确
names.add(100); // × 错误,不能存放整数
成功
这样做的好处是,集合就能帮我们自动检查类型是否正确,防止存入错误类型的数据。
任务二:泛型方法
小明是某电商网站的程序员,负责开发订单验证功能。他发现验证订单信息时需要检查很多不同类型的数据:
- 订单号(字符串类型):必须是10位
- 订单金额(数字类型):必须大于0元
如果用传统方法,他需要写两个不同的方法:
public static boolean verifyOrderNo(String orderNo) { ... }
public static boolean verifyAmount(double amount) { ... }
这样写不仅代码重复,而且每增加一种新的验证类型,就要新增一个方法。有没有更好的解决方案呢?
这时,泛型方法就派上用场了!通过一个方法就能处理不同类型的数据验证,既简化了代码,又提高了复用性。让我们看看具体是怎么实现的…
任务三:泛型接口
小明正在开发一个校园支付系统,需要同时支持两种支付方式:
- 支付宝支付:使用真实货币(元)
- 校园卡支付:使用积分
这两种支付方式虽然都需要实现"支付"和"查询余额"的功能,但处理的数据类型不同:
- 支付宝处理的是小数(Double类型,比如99.9元)
- 校园卡处理的是整数(Integer类型,比如100积分)
如何用一个接口来统一管理这两种不同类型的支付方式呢?这时候,泛型接口就派上用场了!
通过下面的代码,我们来看看泛型接口的两种实现方式,以及它们各自的特点…
// 定义支付接口(泛型接口)
interface Payment<T> {
boolean pay(T amount); // 支付方法
T getBalance(); // 获取余额
}
// 方式一:明确类型的接口实现 - 支付宝支付
class AliPay implements Payment<Double> {
private Double balance = 1000.0;
@Override
public boolean pay(Double amount) {
if (balance >= amount) {
balance -= amount;
System.out.println("支付成功:" + amount + "元");
return true;
}
return false;
}
@Override
public Double getBalance() {
return balance;
}
}
// 方式二:泛型类型的接口实现 - 校园卡支付
class CampusCard<T> implements Payment<T> {
private T balance;
public CampusCard(T balance) {
this.balance = balance;
}
@Override
public boolean pay(T amount) {
System.out.println("支付积分:" + amount);
return true;
}
@Override
public T getBalance() {
return balance;
}
}
public class Example25 {
public static void main(String[] args) {
// 测试支付宝支付
AliPay aliPay = new AliPay();
aliPay.pay(100.0);
// 测试校园卡支付
CampusCard<Integer> campusCard = new CampusCard<>(500);
campusCard.pay(100);
}
}