Java多态性和向下转型

exe*_*ifs 6 java reflection polymorphism rtti

我正在使用Java的反射API,我正在编写检查给定对象并描述其字段,方法等的方法.

我正在使用该getFields()方法迭代不同的属性并显示对象内容:

public static void display(Integer i)
{
    System.out.println("An integer: " + i);
}

// Basically a method for each primitive type wrapper

public static void display(Object o)
{
    for (Field f : c.getFields())
    {
        System.out.println("A " + o.getClass() + " which is composed of:");
        display(f.get(o));
    }
}
Run Code Online (Sandbox Code Playgroud)

(为简单起见,省略了其他原始类型和数组.)

虽然eventhough Fieldget方法返回一个Object,我认为正确的方法将被调用为原始类型包装器(整数,字符串等),但实际上,只display(Object o)调用它(不执行隐式向下转换).

就目前而言,我发现的唯一解决方案是如果可能的话,粗暴地对这些对象进行低估:

public static void display(Object o)
{
    if (o instanceof Integer)
    {
        display((Integer) o);
        return;
    }
    else if (o instanceof String 
    {
        ... 
    } // And so on

    for (Field f : c.getFields())
    {
        System.out.println("A " + o.getClass() + " which is composed of:");
        display(f.get(o));
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这似乎很难看,我想知道是否有更优雅的方法来确保调用正确的方法.有任何想法吗?

在此先感谢StackOverflow的优秀人才!

irr*_*ble 1

你想要的是Java不支持的所谓“双重调度”。

您可以通过反射来模拟它:检查所有display方法及其参数类型,并根据对象的运行时类型动态调用其中之一。

对于这个问题来说,这是不必要的聪明。你的 if-else 链就很好。