【发布时间】:2021-08-13 09:15:19
【问题描述】:
我在 4、5 个屏幕上使用非常相似的方法,基本上在不同对象的列表上做同样的事情。现在我提取了该方法以重用它并使其通用。现在,在制作通用列表时,我面临属性问题。它的属性在成为通用时不再可访问。如何克服这个问题。请注意,对于T 中的所有List 对象,我将拥有这些属性,即"GoodsIssueToPerson", "getProductId()"
我的尝试:
@NonNull
private <T> List<T> getSelectedGoodsList(List<T> objectList) {
List<T> modifiedGoodsToSellerList = objectList;
for (int i = 0; i < productSections.size(); i++) {
ProductRowItem rowItem = productSections.get(i);
T goodsEntity
= getGoodsIssuePersonsEntity(rowItem.getProductId(), modifiedGoodsToSellerList);
Double quantity = parseGermanToDecimal(rowItem.getQuantity());
if (goodsEntity != null && quantity > 0) {
setUpdatedQuantity(goodsEntity, quantity);
}
}
// remove items if quantity is 0
modifiedGoodsToSellerList.removeIf(x -> x.GoodsIssueToPerson < 1);
return modifiedGoodsToSellerList;
}
@Nullable
private <T> T getGoodsIssuePersonsEntity(int productId, List<T> objectList) {
Optional<T> matchingObject = objectList.stream().
filter(p -> p.getProductId() == productId).
findFirst();
return matchingObject.orElse(null);
}
private <T> void setUpdatedQuantity(T goodsEntity, List<T> objectList, Double quantity) {
int indexExistingData = objectList.indexOf(goodsEntity);
goodsEntity.GoodsIssueToPerson = quantity;
if (indexExistingData != -1) {
objectList.set(indexExistingData, goodsEntity);
}
}
问题快照:如屏幕截图所示x.GoodsIssueToPerson 不可访问,与p.getProductId 等相同。对于我将使用此方法的对象都将具有这些属性。
任何建议,任何帮助将不胜感激。
【问题讨论】:
-
T可以是任何东西,所以它没有任何这些方法是有道理的。如果T是String,您希望x.GoodsIssueToPerson是什么?您需要T必须实现的某种通用接口。 -
为 T 添加类型绑定,例如
T extends YourClass具有GoodsIssueToPerson字段和/或getProductId方法。 -
@HenryTwist 是的,我知道这一点。想知道如何在仍然可以访问属性的同时使其通用。
-
@roookeee 谢谢 .. 最初我并没有想到它,但我会尝试使用扩展泛型类型并使用基本模型来存储所有字段以供重用。非常感谢。
-
我同意一个定义良好的界面可以帮助很多