具有object和primitive类型的不明确varargs方法

wvt8vs2t  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(344)

考虑以下两组方法。第一个被接受,第二个被拒绝,因为模棱两可。唯一的区别是使用int和integer。
有没有特别需要拒绝第二个呢?这意味着在拳击后接受它(这将导致第一盘)有问题。我错过了什么?
从我的观点来看,java编译器在这里限制太多了。
第1组:

public void test(Object... values) {}

public void test(Integer x, Object... values) {} // difference here

public void b() {
    test(1, "y"); // accepted
}

第二组:

public void test(Object... values) {}

public void test(int x, Object... values) {} // difference here

public void b() {
    test(1, "y"); // marked as ambiguous
}

集合2产生编译器错误:

error: reference to test is ambiguous
    test(1, "y"); // marked as ambiguous
    ^
  both method test(Object...) in T and method test(int,Object...) in T match

java 1.8,eclipse氧气

yv5phkfx

yv5phkfx1#

为了结束这个问题,让我总结一下我的问题的实际答案,因为我理解他们:根据规范,行为是正确的。规范可以放宽,以便将基元类型作为其非基元对应类型覆盖。一个尚未完成的原因是指定和实现快速正确的解析器的复杂性。

pexxcrt2

pexxcrt22#

不同的是,在第一种情况下 1 参数需要装箱成整数,然后选择最合适的方法;那就是 (Integer, Object...) 版本。
在第二种情况下,有两种选择-拳击或不。这就是它模棱两可的原因。
我同意这是违反直觉的。

ifmq2ha2

ifmq2ha23#

编译器所做的是实现jls 15.12.2.5中规定的规则,以便在多个方法适用于调用的情况下选择最具体的方法。在您问题中的示例中,规范中的这一行涵盖了差异:
a型 S 比类型更具体 T 对于任何表达式,如果 S <: T (§4.10).
哪里 S <: T 意思是 S 是的子类型 T .
在示例#1中:
有两种适用的方法
类型 Integer 是的子类型 Object ,所以更具体。
因此,第二种方法比第一种方法更具体。
因此选择了第二种方法。
在示例2中:
有两种适用的方法
类型 int 不是的子类型 Object 反之亦然,所以两种类型都不比另一种更具体。
因此,两种方法都不比另一种更具体。
因此,调用是不明确的。

相关问题