public class OverloadingVarargs{
  static void f(float i,Character...args){
      System.out.println("first");
  }
  static void f(Character...args){
      System.out.println("second");
  }
  public static void main(String[] args){
      f(1,'a');
      f('a','b');
  }

上面的程序编译后出现如下的错误消息:
reference to f is ambiguous下面的程序可以正常运行:
public class OverloadingVarargs{
  static void f(float i,Character...args){
      System.out.println("first");
  }
  static void f(char c,Character...args){
      System.out.println("second");
  }
  public static void main(String[] args){
      f(1,'a');
      f('a','b');
  }

输出为:
first
second

解决方案 »

  1.   

    我的问题是为什么第一个程序执行到f('a','b'); 会出错。
      

  2.   

       我的看法,不一定对哦。
    你第一个错在f('a','b')没有方法给他调用,如果你是想调用static void f(float i,Character...args){ 
      这的i是float类型,所以报错! 
      

  3.   

    优先匹配基本类型。
    可以去看java语言规范,里面有对匹配规则的介绍。
      

  4.   

    f('a','b');这个在引用f方法时,调用不明确。
    因为
    static void f(float i,Character...args)

    static void f(Character...args)
    都是匹配的。
    而你改后的那个就可以明确匹配。
      

  5.   

    具体说就是,你的f('a','b')中的'a'可以自动转换为float。因为是从小的转到大的 ,可以自动转换的。
    f('a','b')与你写的两个方法都匹配。所以错了。
      

  6.   

    第一个程序中的f( ,)和f()是重载方法,     
     f(1,'a'); //完全匹配方法 static void f(float i,Character...args)
     f('a','b'); //因为没有像 static void f(char c,Character...args)这样的方法声明,所以不能匹配相应的类型,其实'a'可以自动转化为int类型第二个程序中的方法调用能够匹配类中方法的声明,所以调用没有任何问题。
      

  7.   

     f(1,'a'); 
    改为f(1.0f,'a')。
      

  8.   

    因为你的f(1,'a')中的1被当成int型的,所以找不到对应的方法;
    而你的对应方法中是float型,所以需要一个float型实参,仅写成1.0还是不行,会被当成double,因而须写成1.0f,表示这是一个单精度的浮点数。over
      

  9.   


    楼主总结:
      5楼和6楼的learningDIY的说法是对的。在第一个程序中,f(1,'a')是可以调用static void f(float i,Character...args){ System.out.println("first");}的,1会被自动转为float型。
      而f('a','b')则是两个方法都能调用,故会出错。
      

  10.   

    'a' -> 97 -> 97.0,所有會ambiguous
    學習了