Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类型提升和方法重载(多个选项)_Java_Overloading_Type Promotion - Fatal编程技术网

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
      通过严格或松散的调用适用,并且当
      m1
      具有形式参数类型S1、…、Sn和
      m2
      具有形式参数类型T1、…、Tn时,对于所有i(1),对于参数
      ei
      ,类型Si比Ti更具体≤ 我≤ n、 n=k)

    对于任何表达式,如果S被指定为直接超类型关系
    1
    的自反和传递闭包,则类型S比类型T更具体,后者包括,对于基元类型

    • double
      >1
      float
    • long
      >1
      int

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



    (请注意,此处“子类型”的概念也适用于基本类型,而不仅仅适用于“类之间的继承”)

    抱歉,但完整的规则集太复杂,无法在此处进行合理的转录,但您可以在语言规范中查看它们,网址为: