gpt4 book ai didi

java - 类型提升和方法重载(多选)

转载 作者:行者123 更新时间:2023-11-30 01:49:43 26 4
gpt4 key购买 nike

当由于类型提升而有多个可接受的方法时,决定执行哪个方法的因素是什么?

这里是示例代码

public class Demo {
public static void main(String[] args) {
byte a = 100;
long b = 10000;
test(a, b);
}

public static void test(long a, double b) {
System.out.println("Method 2");
}

public static void test(int a, float b) {
System.out.println("Method 1");
}
}

输出是:方法1如所写,但方法2如果我注释掉test(int a, float b)

这是为什么呢?它是否尝试进行最少数量的类型提升?它是否试图先提出论点 1,然后再提出论点 2?它基于某种类型的优先级吗?

我见过这个问题:How method-overloading and primitive types works? ,其中包括以下语句:

  1. If more than one method was identified, pick the most specific one.

我要求了解如何在所有可能的方法中选择要执行的 final方法的更多细节。我知道会发生类型提升,但是如果类型提升后有多个选项,编译器如何确定 final方法?换句话说,从上面的陈述来看,什么是更具体

最佳答案

虽然您链接到的问题和答案已经在某种程度上涵盖了这一点,但人们可以在这里查看更具体的案例(双关语)。特别是,相关的“决策路径”指的是15.12.2.5. Choosing the Most Specific Method的(有点复杂)描述。在 JLS 中。

该部分首先说:

The informal intuition is that one method is more specific than another if any invocation handled by the first method could be passed on to the other one without a compile-time error.

这已经非常有帮助了,因为您可以看到传递给 test(int, float) 方法的任何内容也可以传递给 test(long, double) 方法。所以第一个更具体。

但是引用规范:

One applicable method m1 is more specific than another applicable method m2, for an invocation with argument expressions e1, ..., ek, if any of the following are true:

  • m2 is not generic, and m1 and m2 are applicable by strict or loose invocation, and where m1 has formal parameter types S1, ..., Sn and m2 has formal parameter types T1, ..., Tn, the type Si is more specific than Ti for argument ei for all i (1 ≤ i ≤ n, n = k).

...

A type S is more specific than a type T for any expression if S <: T

后者指的是4.10. Subtyping 其中父类(super class)型关系 :>被指定为直接父类(super class)型关系 >的自反和传递闭包1,后者包括,对于原始类型

  • double >1 浮点
  • >1 int
<小时/>

因此方法 test(int, float)test(long, double) 更具体,因为 int的子类型code>longfloatdouble 的子类型。

<小时/>

(注意,这里“子类型”的概念也适用于原始类型,而不仅仅是“类之间的继承”)

关于java - 类型提升和方法重载(多选),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56483624/

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