重载方法调用:优先考虑实参数类型
Java 的方法重载机制会根据声明的参数类型选择最合适的实现。然而,一个常见的误解是它在重载解析期间也会考虑实际类型。
挑战
考虑以下代码片段:
interface Callee { public void foo(Object o); public void foo(String s); public void foo(Integer i); } class CalleeImpl implements Callee { public void foo(Object o) { logger.debug("foo(Object o)"); } public void foo(String s) { logger.debug("foo(\"" + s + "\")"); } public void foo(Integer i) { logger.debug("foo(" + i + ")"); } } Callee callee = new CalleeImpl(); Object i = new Integer(12); Object s = "foobar"; Object o = new Object(); callee.foo(i); callee.foo(s); callee.foo(o);
执行后,此代码意外地打印了 3 次“foo(Object o)”,而不是根据真实参数选择不同的实现
根本原因
在 Java 中,方法调用会为调用该方法的对象动态分派,但不会为参数类型分派。 Java 语言规范明确指出“参数的编译时类型”决定了所选方法签名。
因此,参数声明会覆盖参数分配期间发生的任何潜在类型转换或提升。因此,所提供代码中的所有三个调用都解析为“foo(Object o)”方法,因为 Object 是所有三个参数的声明类型。
解决方案
要解决此问题并在重载解析中优先考虑真实参数类型,请考虑以下策略:
以上是Java 方法重载如何处理实际参数类型与声明类型?的详细内容。更多信息请关注PHP中文网其他相关文章!