【问题标题】:Type Promotion and Method Overloading (Multiple Options)类型提升和方法重载(多选)
【发布时间】:2019-10-22 07:54:50
【问题描述】:

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

这里是示例代码

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");
  }
}

输出是:Method 1 书面但Method 2 如果我注释掉test(int a, float b)

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

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

  1. 如果确定了不止一种方法,请选择最具体的一种。

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

【问题讨论】:

标签: java overloading type-promotion


【解决方案1】:

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

该部分首先说:

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会出现编译时错误,那么一个方法比另一个方法更具体。

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

但参考规范:

一个适用的方法m1比另一个适用的方法m2更具体,用于参数表达式e1, ..., ek的调用,如果以下任何一个为真:

  • m2 不是通用的,m1m2 可以通过严格或松散的调用来应用,其中m1 具有形式参数类型 S1、...、S nm2 有形参类型 T1, ..., Tn,类型 Si 更多对于所有 i (1 ≤ i ≤ n, n = k),参数 ei 的特定于 Ti

...

如果 S <: t>,对于任何表达式,类型 S 都比类型 T 更具体

后者指的是4.10. Subtyping 部分,其中超类型关系:&gt;被指定为直接超类型关系&gt;的自反和传递闭包1,后者包括,对于原始类型

  • double >1float
  • long >1int

所以test(int, float) 方法比test(long, double) 更具体,因为intlong 的子类型,而floatdouble 的子类型。


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

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 2018-06-19
    • 2012-03-10
    • 2015-03-30
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多