动态绑定

maidongdong 2006-03-15 06:53:43
core java I(6e)p148中的一段话,不甚明白,请教,如下:

2)编译器检查方法调用中提供的参数类型.如果在所有名为f的方法中有一个的参数类型同调用提供的参数类型最为匹配,那么就选择调用这个方法,这个过程称为"重载解析".例如:对调用x.f("hello"),编译器会挑选f(string),而不是f(int).由于存在类型转换(int转成double,等等),情况会变得负责.如果编译器无法找到任何同参数类型匹配的方法,或者找到了多个参数类型在转换后能够匹配的方法,那么编译器会报告错误.

事例:

public class Test{
public Integer copyFactory(Integer source){
return new Integer(source.intValue());
}

public Object copyFactory(Object source) throws Exception{
throw new Exception("error");
}

}

上面的代码是正确的,但是我有点疑惑,书中提到的"或者找到了多个参数类型在转换后能够匹配的方法,那么编译器会报告错误",这种情况指的是哪种情况?上面的例子中(Integer 转换为Object)难道不算吗?
事实上上面的代码是正确的,编译也不会报错.

欢迎大家讨论.
...全文
102 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
maidongdong 2006-03-17
  • 打赏
  • 举报
回复
Dan1980(不用IDE的大傻瓜):
首先,我看过英文版本,翻译过来就是书中翻译的意思(比较简单,不是什么高深莫测的语句)
其次,照他说的这个情况,就是我上面举的那个例子(事实上,我举的那个例子调试是正确的,
也确实可以那么用),我相信作者应该指的不是(
public Object copyFactory(Object source);
public Object copyFactory(Object source);就是一个方法不小心写了两遍,这显然是
不正确的)。
最后,我也不知道他想表达什么,只能认为是他错了。
Dan1980 2006-03-16
  • 打赏
  • 举报
回复
楼主有点把简单问题复杂化了。

其实作者的意思就是指“多个参数类型一致的方法”,只不过说成“多个参数类型在转换后能够匹配的方法”在语言上更为严密。因为,参数传递过程中可以自动向上转型,而不一定是用参数本来的类型来匹配。比如,假设定义了两个方法f(Object o),g(Object o),而调用时使用f("hello"),因为"hello"是在转换后和Object匹配的,而这时有两个能够匹配,所以无法编译。所以这句话不能解释为不允许有多个方法可以与参数转化后相匹配,这是不符合逻辑的。另外,也有可能是在将英文翻译成中文时产生的这种歧义。
prowns 2006-03-16
  • 打赏
  • 举报
回复
Object类对象是个特例吧,它是所有类的超类,如果照楼主的想法的话那岂不是相同的方法名的方法在参数个数相同的情况下只能接收同一种类对象了
maidongdong 2006-03-16
  • 打赏
  • 举报
回复
楼上的你好像不懂我上面在问什么吗,你跑题了。
zx2002027 2006-03-15
  • 打赏
  • 举报
回复
或者找到了多个参数类型在转换后能够匹配的方法,那么编译器会报告错误,因为编译器不知道该调用哪个方法,如果在同一个类中有多个同名的方法,那么编译器会根据参数来匹配,不会根据方法的返回类型来匹配

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧