我有很多由 JAXB 生成的类,我无法更改它们。我必须以非常相似的方式获取某些对象的属性值,然后用它们填充表。在这里,我给出了两个这样的 getter 方法的代码:
private String getPropertyIdentifierStringOrNull(IdentifierType obj)
{
if(obj != null)
return obj.getValue();
else
return null;
}
private XMLGregorianCalendar getPropertyXMLGregorianCalendarOrNull(DateType obj)
{
if(obj != null)
return obj.getValue();
else
return null;
}
DateType 和 IdentifierType 没有共同的父类(super class),如本示例代码中的返回值可以是不同的类型。
我正在尝试编写一个方法而不是一堆这些。我使用带有反射的通用方法想出了这个解决方案:
@SuppressWarnings("unchecked")
private <T> T getPropertyOrNull(Object obj)
{
if(obj != null)
{
try
{
return (T) obj.getClass().getMethod("getValue").invoke(obj);
} catch (Exception e)
{
e.printStackTrace();
}
}
return null;
}
这是执行此类调用的好方法还是有更好的解决方案?
最佳答案
我不会为此使用反射。相反,您可以使用 Function
来完成从给定对象中提取所需的属性,如下所示:
static <T, U> U getPropertyOrNull(T obj, Function<? super T, ? extends U> extractor) {
return obj != null ? extractor.apply(obj) : null;
}
你可以这样使用它:
IdentifierType identifier = new IdentifierType();
DateType date = new DateType();
String identifierValue = getPropertyOrNull(identifier, IdentifierType::getValue);
XMLGregorianCalendar dateValue = getPropertyOrNull(date, DateType::getValue);
除了不使用反射之外,这种方法的优点是它是类型安全的,即如果您使用 IdentifierType
和 DateType::getValue
参数调用方法,您会出现编译错误。
关于java - 如何调用同名不同返回值的不同类型对象的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43938922/