Java中是否可以实现动态重载解析?

时间:2010-12-24 02:36:30

标签: java reflection

所以我有一类这样的重载方法:

class Foo {
    public void test(Object value) {
        ...
    }

    public void test(String value) {
        ...
    }
}

我需要将bean的属性值传递给其中一个方法,具体取决于它的类型,但在运行时之前我不知道实际的属性类型。 e.g。

public void run(Object bean, String propertyName) {
    Foo foo = new Foo();
    foo.test(PropertyUtils.getProperty(bean, propertyName));
}

BTW,PropertyUtils.getProperty()是一个辅助方法,它返回bean上指定属性的值。 PropertyUtils.getProperty()返回一个Object,因此将始终调用test(Object value),并忽略实际的属性类型。

我可以在运行时中找出propery类型,即使它的值为null。在Java中有动态转换这样的东西吗?如果没有,是否有办法使用名为?

的正确参数类型重载方法

4 个答案:

答案 0 :(得分:5)

覆盖是Java中的动态绑定。重载具有静态绑定,并且调用哪个函数是在编译时确定的,而不是在运行时确定的。 See this SO question.

因此,您无法使用重载进行运行时选择方法。建议您在java中使用其他OOP设计模式之一,或者至少使用instanceof

public void dispatch(Object o)
{
   if (o instanceof String)
       handleString((String)o);
   else if (o instanceof File)
       handleFile((File)o);
   else
       handleObject(o);
}

答案 1 :(得分:3)

这是访客模式的工作。

答案 2 :(得分:1)

重载的方法解析在Java编译时发生。你必须自己做一个解决方案(一个switch,if-then-else梯形图或表查找),或者找到一个可以用Java实现的不同模式。

答案 3 :(得分:1)

我不确定你想要回答这个问题。你有兴趣建立一个

的情况
test((String)x)

不做同样的事情
test((Object)x)

对于x的{​​{1}}。这是一个坏主意™,只会导致很多混乱。如果您真的想要不同的行为,请使用不同的方法名称。

如果Stringtest(Object x),只需将test(String x)发送到x,那么您无需担心调用哪个String方法。