【发布时间】:2020-03-15 08:45:37
【问题描述】:
这里是 Java 8。我有以下 POJO:
public interface HasPartNumber {
String getPartNumber();
}
@Getter
@Setter
public class InventoryItem implements HasPartNumber {
private String modelNumber;
private String description;
// lots of other fields here
@Override
public String getPartNumber() {
return this.modelNumber;
}
}
public class Inventory extends ArrayList<InventoryItem> {
// Inventory is just an alias of a list of InventoryItem
}
@Getter
@Setter
public class PriceItem implements HasPartNumber {
private String equipmentNumber;
// lots of other fields here
@Override
public String getPartNumber() {
return this.equipmentNumber;
}
}
public class PriceRoster extends ArrayList<PriceItem> {
// PriceRoster is just an alias of a list of PriceItem
}
我理解你们中的一些人可能不喜欢我如何建模Inventory 和PriceRoster,但使用 is-a 和 has-a 黄金法则是正确的。 “库存”不仅仅是InventoryItems 的列表。 PriceRoster 同上。而且,Domain-Driven Design 社区可能会同意这些是有效的数据模型,如果对阅读代码的开发人员有意义的话。
然而,我并没有结婚这种设计。因此,虽然我的建议是将这个数据模型保持在上面,但如果真的不可能在不更改数据模型的情况下完成我在下面描述的内容,我会很灵活。
我正在尝试编写一个通用的PartProcessor 类,它将遍历HasPartNumber impls 的列表并对它们执行处理。我的最佳尝试:
public class PartProcessor<PART_CONTAINER extends List<HasPartNumber>> {
public void process(PART_CONTAINER partContainer) {
partContainer.stream().forEach(part -> {
// Do something here
});
}
}
当我去实例化PartProcessor时产生编译错误:
PartProcessor<Inventory> inventory = new PartProcessor<Inventory>();
我看到的编译器错误是:
"类型参数 'com.example.myapp.Inventory' 不在其范围内;应实现 'java.util.List
' "
有什么想法可以让我的PartProcessor 在HasPartNumbers impl 的任何列表上通用,包括Inventory 和PriceRoster?
【问题讨论】:
标签: java generics collections java-8