这里是 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 和有一条黄金法则,它是正确的。 “库存”只不过是一个 InventoryItems
列表。 PriceRoster
也是如此。并且,Domain-Driven Design如果对阅读代码的开发人员有意义,社区可能会同意这些是有效的数据模型。
但是,我并没有嫁给这个设计。因此,虽然我的建议者会保留此数据模型,但如果在不更改数据模型的情况下确实不可能完成我下面描述的任务,我会灵活处理。
我正在尝试编写一个通用的 PartProcessor
类,它将迭代 HasPartNumber
实现列表并对它们执行处理。我最好的尝试:
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>();
我看到的编译器错误是:
"Type parameter 'com.example.myapp.Inventory' is not within its bound; should implement 'java.util.List<com.example.myapp.HasPartNumber>'"
有什么想法可以让我的 PartProcessor
在 HasPartNumbers
impl 的任何列表上正常工作,包括 Inventory
和 PriceRoster
?
最佳答案
有界类型使类型协变:
public class PartProcessor<PART_CONTAINER extends List<? extends HasPartNumber>> {...
有关更广泛的阅读,请参阅 this answer also .
关于java - 在 Java 中实现接口(interface)实例列表的通用容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58940692/