考虑以下两组方法。第一个被接受,第二个被拒绝,因为模棱两可。唯一的区别是使用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氧气
3条答案
按热度按时间yv5phkfx1#
为了结束这个问题,让我总结一下我的问题的实际答案,因为我理解他们:根据规范,行为是正确的。规范可以放宽,以便将基元类型作为其非基元对应类型覆盖。一个尚未完成的原因是指定和实现快速正确的解析器的复杂性。
pexxcrt22#
不同的是,在第一种情况下
1
参数需要装箱成整数,然后选择最合适的方法;那就是(Integer, Object...)
版本。在第二种情况下,有两种选择-拳击或不。这就是它模棱两可的原因。
我同意这是违反直觉的。
ifmq2ha23#
编译器所做的是实现jls 15.12.2.5中规定的规则,以便在多个方法适用于调用的情况下选择最具体的方法。在您问题中的示例中,规范中的这一行涵盖了差异:
a型
S
比类型更具体T
对于任何表达式,如果S <: T
(§4.10).哪里
S <: T
意思是S
是的子类型T
.在示例#1中:
有两种适用的方法
类型
Integer
是的子类型Object
,所以更具体。因此,第二种方法比第一种方法更具体。
因此选择了第二种方法。
在示例2中:
有两种适用的方法
类型
int
不是的子类型Object
反之亦然,所以两种类型都不比另一种更具体。因此,两种方法都不比另一种更具体。
因此,调用是不明确的。