关于方法签名中的var-args的类似问题被问了几次(1,2),但是有一个极端的例子,我不明白。编译器可以区分int...
和long...
重载的方法签名,并以较小的类型调用该方法。
但是byte
和char
的大小显然不相同,但是编译器抱怨test()
下面的方法不明确:
static void test(byte... v) { System.out.println("Byte"); }
static void test(char... v) { System.out.println("Char"); }
public static void main(String[] args) {
test(); // Error:(7, 5) java: reference to test is ambiguous
// both method test(byte...) in App and method test(char...) in App match
}
short...
和char...
也会发生同样的情况,但是int...
和char...
并不确定。
为什么char...
被认为与byte...
或short...
模棱两可,而byte...
和short...
本身在方法签名上却是可区分的?
static void test(byte... v) { System.out.println("Byte"); }
static void test(short... v) { System.out.println("Short"); }
public static void main(String[] args) {
test(); // Byte
}
答案 0 :(得分:0)
您没有在调用中包含 any 参数,因此编译器将如何知道类型?
也
“否则,如果操作数是编译时类型的byte,short或char,则通过扩展基元转换将它提升为int类型的值(第5.1.2节)。”
https://docs.oracle.com/javase/specs/jls/se10/html/jls-5.html#jls-5.6
编译器不会将这些类型视为等效。它将它们提升为int
。由于两种形式都提升为int
,因此不知道使用哪种形式。
尝试显式转换参数以解决歧义。
答案 1 :(得分:-2)
test
函数已重载。您需要传递一个适当的参数,以便编译器可以推断要调用的方法。另外,byte
和char
都是varargs
的特定特定原语(我的意思是编译器将它们类似地对待),从而引起歧义。