一个诡异的重载问题

珊瑚 2012-04-30 04:25:58
为何f(1)能通过,而l(1,1,1)却不能通过,会报重载模糊匹配的错误,求大神解答

public class Overloading {

public static void main(String[] args) {
f(1);
l(1,1,1);
}

public static void f(int i){
System.out.println("int");
}
public static void f(float i){
System.out.println("float");
}

public static void l(int... i){
System.out.println("int");
}
public static void l(float... i){
System.out.println("float");
}


...全文
134 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
珊瑚 2012-05-02
  • 打赏
  • 举报
回复
我不是想问怎么才能编译通过,只是想知道为什么会有这么诡异的问题,3楼回答的还稍微靠谱
sdojqy1122 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
我不是想问怎么才能编译通过,只是想知道为什么会有这么诡异的问题,3楼回答的还稍微靠谱
[/Quote]
恩。
我说了这种情况会导致系统混乱。
当没有参数时l();调用该方法是系统不知道该调用l(int... i)还是l(float... i),这样就会引发错误,因为两个都匹配。而且也没有那一个更匹配的概念。这就有悖于方法重载的规范。所以可能规范干脆不允许这种写法的重载,以免引起错误。
sdojqy1122 2012-04-30
  • 打赏
  • 举报
回复
我认为是这种情况导致混乱
public static void l(int... i){
System.out.println("int");
}
public static void l(float... i){
System.out.println("float");
}
当 l();时这种情况会产生混乱导致重载失败,
不妨试试 public static void l(int i){
System.out.println("int");
}
看还会不会出问题,我还没有调试。应该不会出问题。希望是这样。
PaulForTheLove 2012-04-30
  • 打赏
  • 举报
回复

public static void l(int... i) {
System.out.println("int");
} // function 1

public static void l(float... i) {
System.out.println("float");
} // function 2


两个方法删掉任何一个就OK,原因f(1,1,1)两个方法都可以匹配。
Luo_ZH 2012-04-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

貌似单个数字才会默认为整数,一个数组不指定类型是没有默认类型的,你的代码把public static void l(int... i)方法去掉或把public static void l(int... i)方法去掉都能正常编译运行,因为只有一个方法时,编译器只能去匹配唯一的l(int...i)或l(float...i)方法,把参数数组转换成所需的类型,但两个方法同时存在时,编译器无法确定要把参数……
[/Quote]
额~,插入代码应该怎么插入的,我发得怎么这么难看
Luo_ZH 2012-04-30
  • 打赏
  • 举报
回复
貌似单个数字才会默认为整数,一个数组不指定类型是没有默认类型的,你的代码把public static void l(int... i)方法去掉或把public static void l(int... i)方法去掉都能正常编译运行,因为只有一个方法时,编译器只能去匹配唯一的l(int...i)或l(float...i)方法,把参数数组转换成所需的类型,但两个方法同时存在时,编译器无法确定要把参数数组去匹配哪一个方法,就会报重载模糊匹配错误,而像下面这样指定了参数的类型,编译器就能确定应该匹配哪一个方法,就完全没有问题了

public class Overloading {
public static void main(String[] args) {
f(1);
l( 1f, 1f, 1f);
}

public static void f(int i) {
System.out.println("int");
}

public static void f(float i) {
System.out.println("float");
}

public static void l(int... i) {
System.out.println("int");
}

public static void l(float... i) {
System.out.println("float");
}
}
珊瑚 2012-04-30
  • 打赏
  • 举报
回复
那为什么第一个能识别是int,第二个不能识别为int,这是我主要想问的。我知道int ag[]这种做法是可以的,我只是想知道为什么l(1,1,1)是不可以的,跟f(1)为什么会有差异,一个能识别,一个不能识别。
[Quote=引用 1 楼 的回复:]

引用楼主 的回复:
为何f(1)能通过,而l(1,1,1)却不能通过,会报重载模糊匹配的错误,求大神解答

Java code
public class Overloading {

public static void main(String[] args) {
f(1); ////这里实际调用的是 int 这个,因为java编译器默认数值类型是整数!
l(1,1,1)……
[/Quote]
Jeking217 2012-04-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
为何f(1)能通过,而l(1,1,1)却不能通过,会报重载模糊匹配的错误,求大神解答

Java code
public class Overloading {

public static void main(String[] args) {
f(1); ////这里实际调用的是 int 这个,因为java编译器默认数值类型是整数!
l(1,1,1);////对于这个也是一样的道理!还有一点就是,数据类型自动转换,编译器无法识别是 int类型的 1 还是float类型的1,如果你这样调用 l(1f,1f,1f)绝对没问题!
////这种情况下,你要调用int的方法,必须把参数先定义好,如下:int ag[]=new int [3];l(ag);
}

public static void f(in……
[/Quote]
谨记重写的两个必要条件:一:方法名一致,二:参数列表一致!

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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