Varargs Java 不明确调用

2024-03-14

我对Java有点困惑varargs方法:

public static int sum(int ...a) {
    return 0;
}

public static double sum(double ...a) {
    return 0.0;
}

当我尝试调用sum()不传递任何参数,那么int方法的版本被调用。我不明白为什么;通常编译器必须引发错误。

相比之下,当我尝试调用以下代码时,会生成编译器错误sum没有任何争论:

public static int sum(int ...a) {
    return 0;
}

public static boolean sum(boolean ...a) {
    return true;
}

这里适用的一般规则是:如果一个方法签名严格更具体比另一个,然后 Java 选择它而不会出错。

直观上,如果您可以完全删除方法签名,那么它会更具体,而另一个不太具体的方法签名将适用于每个现有的调用。

当需要在签名之间进行选择时sum(int... args) and sum(double... args), 签名sum(int... args)更具体,因为对该方法的任何调用也可以传递给sum(double... args)通过应用加宽转换。这同样不适用于sum(boolean... args)方法,不能进行类似转换。

Java 语言规范,SE 8 版本:

15.12。方法调用表达式

15.12.2.5。选择最具体的方法 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5

Java 编程语言使用以下规则:最具体的方法被选择。

...

对于使用参数表达式 e1, ..., ek 的调用,如果满足以下任一条件,则一个适用的方法 m1 比另一适用的方法 m2 更具体:

...

  • m2 不是泛型,m1 和 m2 可通过严格或松散调用应用,其中 m1 具有形式参数类型 S1, ..., Sn,m2 具有形式参数类型 T1, ..., Tn,类型 Si 是更具体对于所有 i (1 ≤ i ≤ n, n = k),参数 ei 比 Ti 更重要。

...

对于任何表达式,如果 S <: t s>


4.10.子类型化

4.10.1.原始类型之间的子类型化 https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.10.1

双 >1 浮点数

浮动 >1 长

长 > 1 个整数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Varargs Java 不明确调用 的相关文章

随机推荐