Java 类型提升和方法重载(多个选项)
当由于类型提升而存在多个可接受的方法时,哪些因素决定了将执行哪种方法 下面是示例代码Java 类型提升和方法重载(多个选项),java,overloading,type-promotion,Java,Overloading,Type Promotion,当由于类型提升而存在多个可接受的方法时,哪些因素决定了将执行哪种方法 下面是示例代码 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 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
如所写,但如果我注释掉测试(int a,float b)
为什么呢?它是否尝试进行最少的类型提升?它是否试图提升论证1,然后提升论证2?是否基于某种类型的优先级
我看到了这个问题,其中包括:
我想了解更多关于如何在所有可能的方法中选择要执行的最终方法的细节。我知道类型升级会发生,但如果类型升级后有多个选项,编译器如何确定最终的方法?换句话说,从上面的陈述中,什么是更具体的呢?尽管您链接的问题和答案已经在一定程度上涵盖了这一点,但我们可以看看这里更具体的案例(双关语)。特别是,相关的“决策路径”指JLS中的(有点复杂)决策描述 第一节说: 非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会出现编译时错误,那么一个方法比另一个方法更为具体 这已经非常有用了,因为您可以看到传递给
测试(int,float)
方法的任何内容也可以传递给测试(long,double)
方法。所以第一个更具体
但参考规范:
一种适用的方法m1
比另一种适用的方法m2
更具体,用于参数表达式e1,…,ek
的调用,如果以下任何一种为真:
不是泛型,m2
和m1
通过严格或松散的调用适用,并且当m2
具有形式参数类型S1、…、Sn和m1
具有形式参数类型T1、…、Tn时,对于所有i(1),对于参数m2
,类型Si比Ti更具体≤ 我≤ n、 n=k)李>ei
1
的自反和传递闭包,则类型S比类型T更具体,后者包括,对于基元类型
>1double
float
>1long
int
因此,方法
test(int,float)
比test(long,double)
更具体,因为int
是long
的子类型,float
是double
的子类型
(请注意,此处“子类型”的概念也适用于基本类型,而不仅仅适用于“类之间的继承”)抱歉,但完整的规则集太复杂,无法在此处进行合理的转录,但您可以在语言规范中查看它们,网址为: