gpt4 book ai didi

java - java - 当没有接受long的方法时,为什么java将long参数提升为float/double?

转载 作者:IT老高 更新时间:2023-10-28 21:02:58 24 4
gpt4 key购买 nike

这是 SSCCE这演示了所描述的(恕我直言,奇怪的)行为:

public class Test {

public static void print(int param) {
System.out.println("int");
}

public static void print(float param) {
System.out.println("float");
}

public static void print(Long param) { //<--Wrapper type
System.out.println("Long");
}
public static void main(String[] args) {
long param = 100L;
print(param); // output == float
}
}

为什么java会这样做?

最佳答案

Java Language Specification很清楚(强调我的):

15.12.2 Compile-Time Step 2: Determine Method Signature

[...]

  1. The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion [...] If no applicable method is found during this phase then processing continues to the second phase. [...]

  2. The second phase (§15.12.2.3) performs overload resolution while allowing boxing and unboxing [...]

  3. The third phase (§15.12.2.4) allows overloading to be combined with variable arity methods, boxing, and unboxing.

也就是说,在第一步中只有 print(int)print(float) 是合适的。后者匹配,不做进一步调查。


JLS 中也解释了此类规则的原因:

This guarantees that any calls that were valid in the Java programming language before Java SE 5.0 are not considered ambiguous as the result of the introduction of variable arity methods, implicit boxing and/or unboxing.

假设您的 Test 类是针对 Java 1.4 编译的(在自动装箱之前)。在这种情况下,很明显:必须选择 print(float) (假设我们同意为什么 longfloat 被认为是安全的并且可以是隐式的。 ..) 因为 print(Long)long 参数完全不兼容。

稍后您针对 Java 5+ 编译相同的代码。编译器可以:

  • 在此上下文中选择 print(Long) 作为更“明显”。因此,升级到 Java 5 后,您的程序的行为会有所不同...

  • 产生编译错误,因为调用不明确。因此,以前正确的代码不再在 Java 5 下编译(AFAIR 从未如此)

  • ...或保留旧语义并调用与 Java 1.4 下相同的方法

您现在应该明白为什么使用 print(float) - 因为它会在 Java 1.4 下被选择。而且 Java 必须向后兼容。

关于java - java - 当没有接受long的方法时,为什么java将long参数提升为float/double?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14549916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com