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

如何将不同类型拍卖物品存入同一个ArrayList?

如何在同一个ArrayList中存储不同类型的拍卖物品

方案1:定义共同父类或接口(推荐)

通过让所有拍卖物品类继承同一个父类,或者实现同一个接口,将ArrayList的泛型指定为这个父类/接口类型,就能实现统一存储,同时保留类型安全性和多态特性。

示例代码

1. 定义通用父类AuctionItem

public class AuctionItem {
    private String itemId;
    private double startingPrice;

    public AuctionItem(String itemId, double startingPrice) {
        this.itemId = itemId;
        this.startingPrice = startingPrice;
    }

    // 通用方法,子类可重写
    public void showDetails() {
        System.out.printf("拍卖品ID: %s,起拍价: %.2f\n", itemId, startingPrice);
    }

    // getter/setter 略
}

2. 实现子类Book和Collectable

// 书籍类
public class Book extends AuctionItem {
    private String author;
    private String isbn;

    public Book(String itemId, double startingPrice, String author, String isbn) {
        super(itemId, startingPrice);
        this.author = author;
        this.isbn = isbn;
    }

    @Override
    public void showDetails() {
        super.showDetails();
        System.out.printf("书籍作者: %s,ISBN: %s\n", author, isbn);
    }
}

// 收藏品类
public class Collectable extends AuctionItem {
    private String category;
    private int productionYear;

    public Collectable(String itemId, double startingPrice, String category, int productionYear) {
        super(itemId, startingPrice);
        this.category = category;
        this.productionYear = productionYear;
    }

    @Override
    public void showDetails() {
        super.showDetails();
        System.out.printf("收藏品类别: %s,生产年份: %d\n", category, productionYear);
    }
}

3. 统一存储与使用

import java.util.ArrayList;

public class AuctionManager {
    public static void main(String[] args) {
        ArrayList<AuctionItem> auctionItems = new ArrayList<>();

        // 添加不同类型的拍卖品
        auctionItems.add(new Book("B001", 68.5, "余华", "9787506392558"));
        auctionItems.add(new Collectable("C001", 350.0, "民国银元", 1914));

        // 遍历展示所有物品信息
        for (AuctionItem item : auctionItems) {
            item.showDetails();
            System.out.println("---");
        }
    }
}

这种方式的优势:

  • 类型安全,编译时就能检查错误
  • 利用多态特性,无需强制类型转换即可调用通用方法
  • 扩展性强,新增拍卖品类型只需继承AuctionItem即可

方案2:使用ArrayList<Object>(不推荐)

如果不想定义父类/接口,可以直接用Object作为泛型类型,因为所有类都继承自Object。但这种方式存在明显缺陷:

ArrayList<Object> items = new ArrayList<>();
items.add(new Book("B002", 45.0, "王小波", "9787530212594"));
items.add(new Collectable("C002", 180.0, "老邮票", 1980));

// 取出时必须强制类型转换,容易触发ClassCastException
Book targetBook = (Book) items.get(0);

缺点:

  • 类型不安全,编译时无法检查类型错误,运行时可能抛出异常
  • 无法直接调用子类特有的方法,必须先强制转换,代码可读性和维护性差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:57:36