首页 > 解决方案 > 重载方法调用的参数匹配期间的详细过程(步骤)

问题描述

为什么是 (2) c.ERR ( ambiguous )?第一个方法参数 - char ( 'a') 扩展为 float => match。

如果找到匹配项,是否不需要进行步骤 2(装箱/拆箱)或步骤 3(尝试 vararg)?或者我在 JLS 中错过了某事,并尝试了第 2 步和第 3 步?

void f(float f, Character... args) {

}

void f(Character... args) {

}


f(1, 'a'); // OK - void f(float f, Character... args) chosen

f('a', 'b'); // c.ERR - ambiguous

1 没问题

2 是 c.ERR - 模棱两可。

PS 我在 JLS (15.12.2.)SO 上找到了这个,但这对我没有帮助。

标签: java

解决方案


int 1可以扩大到,float但不能装箱Character,所以只有void f(float, Character...)方法签名适用。

然而char 'a', 既可以扩大到也可以float装箱到Character,因此松散的调用转换上下文发现两种方法签名都适用。请注意,在松散调用上下文之前尝试的严格调用上下文找不到任何适用的签名,因为当它尝试扩展原语时,不允许将它们装箱。


推荐阅读