【问题标题】:Is dynamic overload resolution possible in Java?Java中是否可以进行动态重载解析?
【发布时间】:2010-12-24 02:36:29
【问题描述】:

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

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

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

我需要根据 bean 的类型将 bean 的属性值传递给这些方法之一,但直到运行时我才知道实际的属性类型。例如

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

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

我可以在运行时找出属性类型,即使它的值为空。 Java中有动态转换之类的东西吗?如果没有,有没有办法调用具有正确参数类型的重载方法?

【问题讨论】:

  • “动态转换”的意思是“动态重载解析”,对吧?
  • @Lambert 没错。

标签: java reflection


【解决方案1】:

覆盖是 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);
}

【讨论】:

    【解决方案2】:

    这是访问者模式的工作。

    【讨论】:

    • 如果有问题的对象可以被架构成共享一个公共接口。如果没有,(例如字符串、整数或文件),则需要进行一些手动测试。
    【解决方案3】:

    重载的方法解析发生在 Java 的编译时。您必须自己解决问题(开关、if-then-else 梯形图或表格查找),或者找到可以在 Java 中实现的不同模式。

    【讨论】:

      【解决方案4】:

      我不确定你是否想要这个问题的答案。您有兴趣设置一种情况,其中

      test((String)x)
      

      不做同样的事情

      test((Object)x)
      

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

      如果xString,只需让test(Object x) 分派到test(String x),那么您无需担心调用哪个test 方法。

      【讨论】:

        猜你喜欢
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 2011-05-02
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多