为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

暮色呼如 2019-06-18 16:58:09
我正在试验这段代码: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)?基于参数实数类型的过载方法选择
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

我期望方法选择考虑真实(而不是声明的)参数类型。我是不是遗漏了什么?

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

引用Java语言规范:

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


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 280 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号