在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 ..
答案 0 :(得分:3)
这两种方法都可以使用您输入的第一个参数f(1,2);
,这就是您出现歧义的原因。
如果你做的话
f((float)1,2);
你不会得到错误例如
答案 1 :(得分:3)
在Java语言中,int值可以自动转换为浮点值(不允许相反)。
因此,当您拨打
时f(1,2)
Java编译器匹配自动类型转换允许的所有可能签名,即:
如果您打算调用f(int,...)或f(float,float),编译器不会知道这种歧义。
答案 2 :(得分:2)
当多种方法适用时,编译器会尝试查找最具体的方法。如果两个方法最具体,那么就会出现歧义,并且会出现错误。
总之(actual rules稍微复杂一点):
f(1, 2)
,两种方法都适用(1可以是整数或浮点数)float
和Integer
之间没有关系(示例:如果您有f(int i, Integer... j)
与f(float f, Integer... j)
,前者会更具体,因为int
比基元中的float
更具体。同样,如果您有{{1}与f(Number f, Integer... i)
相比,后者更具体,因为f(Integer... i)
扩展了Integer
)。答案 3 :(得分:1)
运行时可以选择使用整数列表转换函数来调用任一函数。这就是混乱所在。您提供的任何整数列表也可以转换为另一个调用,其中单个前导浮点后跟一个整数列表。