A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 为你而去 中级黑马   /  2014-4-8 00:12  /  1024 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Overloading1.java无法通过编译,但Overloading2.java却顺利通过编译。这是为什么?


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


public class Overloading2 {
       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[/code]

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

2 个回复

倒序浏览
问题都在 f('a','b') 这句上!

因为'a'对应的ASCII 值是 97,所以编译也认为'a'是 97.0,

所以 java 编译器在编译时,Overloading1 中 f('a','b') 这句,两个方法的优先级是一样的(个人理解,也不知道这样说对不对)java 编译器不能识别它对应的到底是哪个方法!

所以就会报错了!

Overloading2 中有 char 类型的参数,所以直接对应的是就是第二个方法

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
就是楼上说的那句错了,
编译的时候有"歧义",
f((float)'a', 'b');这样写才能消除歧义。

当然你改其他地方,反正就是类型对了就可以了,
感觉深究这种错误,有点死扣啊。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马