一尘不染

Java 基于参数实型的重载方法选择

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);

打印foo(Object o)三遍。我希望方法选择要考虑实际的(而不是声明的)参数类型。我想念什么吗?是否有修改此代码,以便它会打印的方式foo(12)foo("foobar")和foo(Object o)?


阅读 339

收藏
2020-02-27

共1个答案

一尘不染

我希望方法选择要考虑实际的(而不是声明的)参数类型。我想念什么吗?

是。您的期望是错误的。在Java中,动态方法分派仅发生在调用方法的对象上,而不发生在重载方法的参数类型上。

引用Java语言规范:

调用方法时(第15.12节),实际参数(和任何显式类型参数)的数量以及参数的编译时类型 在编译时用于确定将被调用的方法的签名( §15.12.2)。如果要调用的方法是实例方法,则将在运行时使用动态方法查找(第15.12.4节)确定要调用的实际方法。

2020-02-27