使用泛型绝对是我的弱点,并且需要一些帮助。
该项目旨在开发一个简单的订单/库存系统,用于下订单、跟踪商品和库存,并记录自项目首次启动以来的所有库存和客户添加/删除。这需要读取和写入文件,我选择了 CSV 格式来解析。有两个文件需要解析,一个为 Customers
和一个 Items
.
我想使用 TreeSet 来添加/搜索 log N,但我的文件解析遇到了一些问题。我不想让两个具有重复代码的类为其对象类型工作,而是希望有一个解析类在执行时接收集合和文件路径,并将文件处理成完整的对象集,这两个对象都有不同的字段和方法。
我想出的唯一解决方案是 TreeSet<? extends Object>
,但这意味着我必须对结构中访问的每个对象进行装箱,然后取消装箱。
有没有更简单的方法?
最佳答案
以下是您的层次结构的示例
class CVSParser<T> {
private final RecordHandler<T> handler;
public CVSParser<T>(RecordHandler<T> handler) {
this.handler = handler;
}
public Set<T> parse(File f) {
Set<T> records = new TreeSet<T>();
for (String line : file ) { //I'm paraphrasing here
records.add(handler.parse( splitIntoFields(line) ));
}
}
}
interface RecordHandler<T> {
public T parse(String[] fields);
}
class CustomerHandler implements RecordHandler<Customer> {
public Customer parse(String[] fields) {
return new Customer(fields[0], fields[1]);
}
}
class ItemHandler implements RecordHandler<Item> {
//...
}
Set<Item> items = new CVSParser<Item>(new ItemHandler()).parse(itemsFile);
或者,您可以将泛型下推到 CVSParser
的方法级别,甚至使其静态:
class CVSParser {
public static <T> Set<T> parse(RecordHandler<T> handler, File f) {
//...
}
}
Set<Item> items = CVSParser.parse(new ItemHandler(), itemsFile);
关于java - 泛型和 TreeSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4866559/