gpt4 book ai didi

Java 重载 - long 和 float

转载 作者:行者123 更新时间:2023-12-01 17:37:22 25 4
gpt4 key购买 nike

我试图理解java重载规则。除了以下内容之外,一切似乎都很好,

public static void main(String[] args) {
long aLong = 123L;
foo(aLong);
}

private static void foo(double aDouble) {
System.out.println("Foo aDouble");
}

private static void foo(Long aWrapperLong) {
System.out.println("Foo Wrapper Long");
}

private static void foo(int anInt) {
System.out.println("Foo Int");
}

private static void foo(float aFloat) {
System.out.println("Foo Float");
}

为什么调用解析为 foo(float aFloat)。我从 JLS 了解到以下内容,

This step uses the name of the method and the types of the argument expressions to locate methods that are both accessible and applicable There may be more than one such method, in which case the most specific one is chosen.

我在这里故意使用了 Wrapper Long,而不是原始 long。 64 位大小的原始 long 不会以 foo(double aDouble) 形式结束,而是以 32 位 float foo(float aFloat) 形式结束。

问题Why does Java implicitly (without cast) convert a `long` to a `float`?进一步澄清了这个问题的答案。

最佳答案

这是因为 JLS #15 中的“最具体”规则,又指 JLS #4.10 ,它又引用#4.10.1,其中指出:

The following rules define the direct supertype relation among the primitive types:

  • double >1 float

  • float >1 long

  • long >1 int

  • int >1 char

  • int >1 short

  • short >1 byte

其中“S >1 T”表示“T 是 S 的直接子类型”,根据本节上方的 JLS #4.10。

因此,在这种情况下,在 long 上没有直接匹配的情况下,在查看自动装箱之前,编译器会选择最接近的可用父类(super class)型,即 float >,按上述规则。

关于Java 重载 - long 和 float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61014342/

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