java中的函数歧义

时间:2013-08-04 14:17:09

标签: java function ambiguity

在java中,我面临着一个功能模糊。基本上我正在超载一个可变函数
我正在定义像

这样的功能
        static void f(Integer... a)
        {
            // .. some statements

        }

        static void f(float f,Integer... a)
        {
            // .. some other statements
        }

可以使用以下函数调用

来调用该函数
f(1,2);
f(1.2f,1,2);

并弹出此错误消息

error: reference to f is ambiguous, both method f(Integer...) in Test and method f(float,Integer...) in Test match
        f(1,2);
        ^

有人可以帮助我理解我是否缺少java中的任何基本概念。 thnx ..

4 个答案:

答案 0 :(得分:3)

这两种方法都可以使用您输入的第一个参数f(1,2);,这就是您出现歧义的原因。 如果你做的话

f((float)1,2);

你不会得到错误例如

答案 1 :(得分:3)

在Java语言中,int值可以自动转换为浮点值(不允许相反)。

因此,当您拨打

f(1,2)

Java编译器匹配自动类型转换允许的所有可能签名,即:

  • f(int,int)
  • f(float,int)
  • f(浮动,漂浮)
  • f(int,float)
  • f(int,...)
  • f(float,...)

如果您打算调用f(int,...)或f(float,float),编译器不会知道这种歧义。

答案 2 :(得分:2)

当多种方法适用时,编译器会尝试查找最具体的方法。如果两个方法最具体,那么就会出现歧义,并且会出现错误。

总之(actual rules稍微复杂一点):

  • 编译器确定对于f(1, 2),两种方法都适用(1可以是整数或浮点数)
  • 然后编译器需要确定which method is more specific:在您的情况下,没有一个在规范中定义的意义上更具体,因为floatInteger之间没有关系(示例:如果您有f(int i, Integer... j)f(float f, Integer... j),前者会更具体,因为int比基元中的float更具体。同样,如果您有{{1}与f(Number f, Integer... i)相比,后者更具体,因为f(Integer... i)扩展了Integer)。

答案 3 :(得分:1)

运行时可以选择使用整数列表转换函数来调用任一函数。这就是混乱所在。您提供的任何整数列表也可以转换为另一个调用,其中单个前导浮点后跟一个整数列表。