基于参数实数类型的过载方法选择

我正在试验这段代码:

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

基于参数实数类型的过载方法选择

暮色呼如
浏览 281回答 3
3回答

小怪兽爱吃肉

我期望方法选择考虑真实(而不是声明的)参数类型。我是不是遗漏了什么?是。你的期望是错误的。在Java中,动态方法分派只发生在调用方法的对象,而不是重载方法的参数类型。引用Java语言规范:当调用方法(§15.12)时,实际参数的数量(以及任何显式类型参数)和参数的编译时类型。在编译时,用于确定将被调用的方法的签名(第15.12.2节)。如果要调用的方法是实例方法,则将在运行时使用动态方法查找(§15.12.4)确定要调用的实际方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java