You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在创建Box对象时为其内部ArrayList指定数据类型与有效值范围

解决方案:泛型+自定义验证器实现类型与范围约束

通过泛型约束元素类型,配合自定义验证器接口实现有效值范围的校验,完美满足你每个Box实例专属类型与规则的需求。

核心实现步骤

1. 定义验证器接口与泛型Box类

先创建一个通用的验证器接口封装元素校验逻辑;同时将Box改为泛型类,确保每个实例只能处理指定类型的元素。

import java.util.ArrayList;
import java.util.List;

// 验证器接口:定义元素校验规则
interface Validator<T> {
    boolean validate(T item);
}

// 泛型Box类:约束元素类型并集成校验逻辑
class Box<T> {
    private final String boxName;
    private final List<T> items;
    private final Validator<T> validator;

    // 构造方法:传入名称和对应的校验规则
    public Box(String boxName, Validator<T> validator) {
        this.boxName = boxName;
        this.validator = validator;
        this.items = new ArrayList<>();
    }

    // 添加元素前先校验,符合规则才加入集合
    public boolean addItem(T item) {
        if (validator.validate(item)) {
            items.add(item);
            return true;
        }
        System.err.println("[" + boxName + "] 元素 '" + item + "' 不符合规则,添加失败");
        return false;
    }

    // 返回只读副本,避免外部直接修改内部集合
    public List<T> getItems() {
        return new ArrayList<>(items);
    }
}

2. 创建不同规则的Box实例

在主方法中,针对每个Box的需求,通过Lambda表达式传入对应的校验逻辑,实现类型与范围的双重约束:

public class Main {
    public static void main(String[] args) {
        // box1:仅允许添加-50.0至50.0的Double类型元素
        Box<Double> box1 = new Box<>("box1", item -> item >= -50.0 && item <= 50.0);
        box1.addItem(3.14);    // 符合规则,添加成功
        box1.addItem(60.0);    // 超出范围,添加失败
        box1.addItem(-50.0);   // 边界值,添加成功
        System.out.println("box1 元素列表:" + box1.getItems());

        // box2:仅允许添加0至10的Integer类型元素
        Box<Integer> box2 = new Box<>("box2", item -> item >= 0 && item <= 10);
        box2.addItem(5);       // 符合规则,添加成功
        box2.addItem(11);      // 超出范围,添加失败
        box2.addItem(0);       // 边界值,添加成功
        System.out.println("box2 元素列表:" + box2.getItems());

        // box3:仅允许添加特定的String类型元素(示例:apple/banana/orange)
        Box<String> box3 = new Box<>("box3", item -> List.of("apple", "banana", "orange").contains(item));
        box3.addItem("apple"); // 符合规则,添加成功
        box3.addItem("grape"); // 不在允许列表,添加失败
        System.out.println("box3 元素列表:" + box3.getItems());
    }
}

关键特性说明

  • 编译时类型安全:泛型会在编译阶段拦截错误类型的输入(比如给box1传入Integer会直接编译报错),避免运行时类型转换异常。
  • 规则灵活可配置:Validator接口实现了校验逻辑与Box类的解耦,你可以为每个Box实例定制任意复杂的规则(范围、枚举值、正则匹配等)。
  • 数据安全性:getItems方法返回集合的副本,避免外部代码直接修改Box内部的元素列表,保证数据一致性。

内容的提问来源于stack exchange,提问作者swat0k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:01:18