我正在以List的形式获取对象的属性,其中AvsAttribute如下:
class AvsAttribute {
String attrName,
String value
}
我要按以下方式获取任何实体的属性值,因为我不想使用反射,所以这样做了:
@Override
public List<AvsAttribute> getAttributes(List<String> attributeNameList, final @NonNull T entity)
throws JsonProcessingException, JSONException {
List<AvsAttribute> attributeList = new ArrayList<>();
objectMapper.setSerializationInclusion(Include.NON_NULL);
String jsonString = objectMapper.writeValueAsString(entity);
JSONObject jsonObject = new JSONObject(jsonString);
Iterator<String> keysItr = jsonObject.keys();
while (keysItr.hasNext()) {
String key = keysItr.next();
String value = jsonObject.get(key).toString().trim();
attributeList.add(AvsAttribute.builder().name(key).value(value).build());
}
if (CollectionUtils.isNotEmpty(attributeNameList)) {
return attributeList.stream().filter(item -> attributeNameList.contains(item.getName()))
.collect(Collectors.toList());
}
return attributeList;
}
但是我想使AvsAttribute通用如下:
class AvsAttribute<T> {
String attrName,
T value
}
但是我无法弄清楚应该对上面的getAttributes()函数进行什么更改,以便它可以与上述通用类一起工作。
答案 0 :(得分:0)
我认为它已经可以使用通用类型参数了。您需要在.value(String value)
构建器中设置AvsAttribute
函数,以将给定的字符串安全地解析为类型T
。
然后,您可以放心,以下行将正确获取通用属性值:
AvsAttribute.builder().name(key).value(value).build()
这有意义吗?
无论如何,祝您的代码好运。
答案 1 :(得分:0)
在?
声明和attributeList
类型中使用通配符return
。