Tag: method dispatch

在没有Double Dispatch / Visitor模式的情况下解决Java的静态方法调度问题

我正在使用提供这些方法的类Foo : String overloadedMethod(Object) String overloadedMethod(Goo) 由于Java静态调度非接收器参数,我不能只传递我的value (它是一个Object ,但可能有动态类型Goo )并依赖JVM动态选择“正确”方法。 这是我目前(丑陋)的解决方法: Object value = …; Foo foo = new Foo(); if (value instanceof Goo) { Goo gooValue = (Goo) value; return foo.overloadedMethod(gooValue); // -> overloadedMethod(Goo) } else { return foo.overloadedMethod(value); // -> overloadedMethod(Object) } 有没有更好的方法来做到这一点而不修改Foo的代码 (包含重载方法的类)?

带有null参数的Java方法调度

为什么我(显然)会直接传递null作为参数,或者传递一个我赋值为null的Object ? Object testVal = null; test.foo(testVal); // dispatched to foo(Object) // test.foo(null); // compilation problem -> “The method foo(String) is ambiguous” public void foo(String arg) { // More-specific System.out.println(“foo(String)”); } public void foo(Object arg) { // Generic System.out.println(“foo(Object)”); } 换句话说,为什么foo(…)的(注释掉的)第二次调用没有被调度到foo(Object) ? 更新:我使用Java 1.6。 我可以毫无问题地编译Hemal的代码,但我仍然无法编译。 我看到的唯一区别是Hemal的方法是静态的,而我的方法则不是。 但我真的不明白为什么这应该有所作为……? 更新2:解决了。 我的类中有另一个方法foo(Runnable),因此调度程序无法明确地选择最具体的方法。 (请参阅我在Hemal的第二个答案中的评论。)感谢大家的帮助。