如何将不同类型拍卖物品存入同一个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
相关产品推荐
相关产品推荐

