java - 如何调用同名不同返回值的不同类型对象的方法?

标签 java generics reflection jaxb

我有很多由 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);

除了不使用反射之外,这种方法的优点是它是类型安全的,即如果您使用 IdentifierTypeDateType::getValue 参数调用方法,您会出现编译错误。

关于java - 如何调用同名不同返回值的不同类型对象的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43938922/

相关文章:

java - Lucene:从索引中删除,基于多个字段

java - 如何设置 ICEfaces 冰 :inputFile filename validation error? 的消息

c# - "where NOT derived from"是否有通用类型约束?

Java通过反射访问私有(private)属性

java - 为什么我的 String 方法允许返回 String 和 int 值?

java - Gradle 不将 jsoup 导入到 jar 文件中

java - 不同类的参数化类型和原始类型

ios - Objective-C 泛型-安全数组/字典字面量

java - 在运行时确定 String 中 Java 表达式的返回类型

java - 尝试检索字段值时出现 NoSuchFieldException