java可变参数重载问题

_Ren 2013-08-27 05:52:26
public class Test_Demo {
static void f(float i, Character... s) {
System.out.println("first");

System.out.println(i);
for(Character c :s){
System.out.println(c);
}
}
static void f(Character... s) {
System.out.println("second");
}

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

}
会报错 Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method f(float, Character[]) is ambiguous for the type Test_Demo

at com.test.Test_Demo.main(Test_Demo.java:19)

但是改成
public class Test_Demo {
static void f(float i, Character... s) {
System.out.println("first");

System.out.println(i);
for(Character c :s){
System.out.println(c);
}
}
static void f(char c ,Character... s) {
System.out.println("second");
}

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

}

后就没有问题了 我最大的疑问就是 f(char c ,Character... s) 与 f(Character...s)的区别 为什么添加了一个char c的形参就不报错了
...全文
397 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Ren 2013-09-03
  • 打赏
  • 举报
回复
最后还是没搞懂!只能指望以后深入研究了。
shirui8653719 2013-08-31
  • 打赏
  • 举报
回复
引用 16 楼 shirui8653719 的回复:
我还是第一次看到Character... s这样的参数,什么意思?
哦,知道了,是可变形参。哈哈
shirui8653719 2013-08-31
  • 打赏
  • 举报
回复
我还是第一次看到Character... s这样的参数,什么意思?
templefox 2013-08-31
  • 打赏
  • 举报
回复
要强制转型匹配重载函数 不然会调用函数是不可知的
oh_Maxy 版主 2013-08-30
  • 打赏
  • 举报
回复
嗯,你说的对。 我又参考3L的写法,做了个小例子:

    static void f(char c, Character... s)
    {
        System.out.println("mohu1");
    }
    
    static void f(char c,char c2, Character... s)
    {
        System.out.println("mohu1");
    }

    public static void main(String[] args)
    {
        f('a', 'b');
    }
当非可变参数类型与可变参数的类型相同时,是存在“不确定性”的。 此时与int型那个方法的原因就不一样了。
_Ren 2013-08-30
  • 打赏
  • 举报
回复
引用 11 楼 oh_Maxy 的回复:
[quote=引用 9 楼 zhiyuan199o 的回复:] 8楼的意思我懂,但是实参找形参总应该有个优先级,就像我第二个例子,就不会出现异常。3楼的意思就是f(char c,Character...s)和f(Character...s)的优先级应该是一样的,所以f('a','b')会不知道去找哪一个,但是f(float i,Character...s)明显比f(char c,Character...s)的优先级要低,所以我的第二个例子不会出错,但是为什么当把f(float i,Character...s) 和 f(Character...s) 放在一起的时候就分不出来优先级了呢。
我是这么理解的: 'a'肯定是char型的,当没有哪个方法的首个形参为char或Character时,它开始选择:是要转换为float,还是成为数组的一部分? 也就是说,除非明确确定第一个形参参数为char,否则,float型和可变参数都是要对入参进行转换操作,因此优先级是一样的。(优先级没有高低排序,只有符合或不符合。不符合需要转型)[/quote] 其实我最开始和朋友讨论也是这样猜想的,但是你看三楼的例子就能否定这样的猜想。
郑涛 2013-08-30
  • 打赏
  • 举报
回复
如果你指定 第一个参数char,那'a'优先匹配确定的参数类型
郑涛 2013-08-30
  • 打赏
  • 举报
回复
static void f(Character c ,Character... s) { 也不会报错 比较 static void f(char c,Character... s) { static void f(float i, Character... s) { float x='1';//int 直接转型 char c='1'; 编译器不知道你到底要怎么转型,两种转型对应两个方法
oh_Maxy 版主 2013-08-29
  • 打赏
  • 举报
回复
引用 9 楼 zhiyuan199o 的回复:
8楼的意思我懂,但是实参找形参总应该有个优先级,就像我第二个例子,就不会出现异常。3楼的意思就是f(char c,Character...s)和f(Character...s)的优先级应该是一样的,所以f('a','b')会不知道去找哪一个,但是f(float i,Character...s)明显比f(char c,Character...s)的优先级要低,所以我的第二个例子不会出错,但是为什么当把f(float i,Character...s) 和 f(Character...s) 放在一起的时候就分不出来优先级了呢。
我是这么理解的: 'a'肯定是char型的,当没有哪个方法的首个形参为char或Character时,它开始选择:是要转换为float,还是成为数组的一部分? 也就是说,除非明确确定第一个形参参数为char,否则,float型和可变参数都是要对入参进行转换操作,因此优先级是一样的。(优先级没有高低排序,只有符合或不符合。不符合需要转型)
_Ren 2013-08-28
  • 打赏
  • 举报
回复
难道说,真的没有牛人关注这个问题么??求大神指点。。。
_Ren 2013-08-28
  • 打赏
  • 举报
回复
8楼的意思我懂,但是实参找形参总应该有个优先级,就像我第二个例子,就不会出现异常。3楼的意思就是f(char c,Character...s)和f(Character...s)的优先级应该是一样的,所以f('a','b')会不知道去找哪一个,但是f(float i,Character...s)明显比f(char c,Character...s)的优先级要低,所以我的第二个例子不会出错,但是为什么当把f(float i,Character...s) 和 f(Character...s) 放在一起的时候就分不出来优先级了呢。
oh_Maxy 版主 2013-08-27
  • 打赏
  • 举报
回复
LZ的问题好呀,学习了~ 关于3L的例子,如果把任意方法注释掉,都可以编译通过。 ambiguous 百度了下,含糊不清的意思。看样子,对于'a'这样的字符型,是可以当整型、字符型、浮点型的。 然后再百度了下“java 可变参数”,得到这么一条:“调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数”。 也就是说,会创建一个数组。接下来请看这个: int[] iArr = {'a', 'b','c'}; char[] cArr = {'a', 'b','c'}; 会编译失败么? so,终于搞清楚使用“java可变参数”的方法,为啥会“含糊不清”了。
2013-08-27
  • 打赏
  • 举报
回复
有优先级这么一说,如果你让编译器不知道该选择哪个函数好,是否就会出现这个错误呢。 这里的错到底在哪儿呢。是传入两个字符的那个么? 如果是这个的话,应该可以这么理解。
S117 2013-08-27
  • 打赏
  • 举报
回复
f(1f, 'a'); 默认是double
_Ren 2013-08-27
  • 打赏
  • 举报
回复
现在就是搞不懂这个优先级了,Characher...s 代表的是char 包装类行的多参数,那就不应该报错呀,f(‘a’,'b')就应该直接找到f(Characher...s)方法,它为什么还要去找float,弄到分不清的地步。
末日哥 2013-08-27
  • 打赏
  • 举报
回复
因为'a'会被当做97,你说它找谁去
KingBoo_ 2013-08-27
  • 打赏
  • 举报
回复
补充一下,如果说编译器编译的优先级是static void f(char c, Character... s){} 大于static void f(Character... s){} 的话,上述代码的结果貌似可以说的通。但是请看下面的代码,又是怎么一回事那? public class Test_Demo { static void f(char c, Character... s) { System.out.println("mohu1"); } static void f(Character... s) { System.out.println("mohu1"); } public static void main(String[] args) { f('a', 'b'); } } 也是会出现上述的错误的。
bayougeng 2013-08-27
  • 打赏
  • 举报
回复
因为'a'是char,是可以作为float使用的。 你可以试试把两个方法的参数中的Character改成String,然后: f(1, "a"); f("a", "b"); 这样就没错了。
剑神一笑 2013-08-27
  • 打赏
  • 举报
回复
不知道是什么原理 由这个例子可以看出参数只有可变参数的时候,只能匹配一个数组,而不能写成多个参数来匹配 比如 第一个f(Character... s) 只能匹传Character[] c = new Character[]{'a','a','a','a'}; 不能传‘a’,'b' 求高人解释

50,527

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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