- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当由于类型提升而有多个可接受的方法时,决定执行哪个方法的因素是什么?
这里是示例代码
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? ,其中包括以下语句:
- 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 methodm2
, for an invocation with argument expressionse1, ..., ek
, if any of the following are true:
m2
is not generic, andm1
andm2
are applicable by strict or loose invocation, and wherem1
has formal parameter types S1, ..., Sn andm2
has formal parameter types T1, ..., Tn, the type Si is more specific than Ti for argumentei
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>long
和 float
是 double
的子类型。
(注意,这里“子类型”的概念也适用于原始类型,而不仅仅是“类之间的继承”)
关于java - 类型提升和方法重载(多选),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56483624/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!