为什么编译器认为`byte ...`和`char ...`模棱两可

时间:2019-01-09 20:48:14

标签: java

关于方法签名中的var-args的类似问题被问了几次(12),但是有一个极端的例子,我不明白。编译器可以区分int...long...重载的方法签名,并以较小的类型调用该方法。

但是bytechar的大小显然不相同,但是编译器抱怨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
}

2 个答案:

答案 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函数已重载。您需要传递一个适当的参数,以便编译器可以推断要调用的方法。另外,bytechar都是varargs的特定特定原语(我的意思是编译器将它们类似地对待),从而引起歧义。