首页 >Java >java教程 >Java 方法重载如何处理实际参数类型与声明类型?

Java 方法重载如何处理实际参数类型与声明类型?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-16 03:26:09546浏览

How Does Java Method Overloading Handle Real Parameter Types vs. Declared Types?

重载方法调用:优先考虑实参数类型

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn