6.4 泛型

系列 - JAVA集合

本实验手册介绍了Java泛型的基本概念和应用,包括泛型类、泛型方法和泛型接口。通过三个任务,展示了如何使用泛型来解决不同类型数据的存储和处理问题,提高代码的复用性和可读性。

小明在开发一个学生成绩管理系统,需要分别存储不同类型的成绩:

  • Java课程要存储百分制分数(整数)
  • 英语课程要存储等级(A、B、C、D)
  • 体育课程要存储是否及格(布尔值)

我们之前学过的ArrayList、HashSet、HashMap等集合类都支持泛型。这意味着在创建集合时,我们可以指定集合中要存放的数据类型:

java

// 存放整数的集合
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(100);  // √ 正确
numbers.add("abc"); // × 错误,不能存放字符串

// 存放字符串的集合
ArrayList<String> names = new ArrayList<>();
names.add("张三");  // √ 正确
names.add(100);    // × 错误不能存放整数
成功
这样做的好处是,集合就能帮我们自动检查类型是否正确,防止存入错误类型的数据。

小明是某电商网站的程序员,负责开发订单验证功能。他发现验证订单信息时需要检查很多不同类型的数据:

  • 订单号(字符串类型):必须是10位
  • 订单金额(数字类型):必须大于0元

如果用传统方法,他需要写两个不同的方法:

java

public static boolean verifyOrderNo(String orderNo) { ... }
public static boolean verifyAmount(double amount) { ... }

这样写不仅代码重复,而且每增加一种新的验证类型,就要新增一个方法。有没有更好的解决方案呢?

这时,泛型方法就派上用场了!通过一个方法就能处理不同类型的数据验证,既简化了代码,又提高了复用性。让我们看看具体是怎么实现的…

小明正在开发一个校园支付系统,需要同时支持两种支付方式:

  • 支付宝支付:使用真实货币(元)
  • 校园卡支付:使用积分

这两种支付方式虽然都需要实现"支付"和"查询余额"的功能,但处理的数据类型不同:

  • 支付宝处理的是小数(Double类型,比如99.9元)
  • 校园卡处理的是整数(Integer类型,比如100积分)

如何用一个接口来统一管理这两种不同类型的支付方式呢?这时候,泛型接口就派上用场了!

通过下面的代码,我们来看看泛型接口的两种实现方式,以及它们各自的特点…

java

// 定义支付接口(泛型接口)  
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);  
    }  
}

相关内容