所以我有一类这样的重载方法:
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中有动态转换这样的东西吗?如果没有,是否有办法使用名为?
的正确参数类型重载方法答案 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}}。这是一个坏主意™,只会导致很多混乱。如果您真的想要不同的行为,请使用不同的方法名称。
如果String
是test(Object x)
,只需将test(String x)
发送到x
,那么您无需担心调用哪个String
方法。