当前位置: 首页 > 知识库问答 >
问题:

类型提升和方法重载(多个选项)

轩辕弘雅
2023-03-14

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

这是示例代码

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, flow b)

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

我见过这个问题:方法重载和基元类型是如何工作的?,其中包括以下声明:

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

共有1个答案

郎仰岳
2023-03-14

虽然您链接的问题和答案在某种程度上已经涵盖了这一点,但我们可以看看这里更具体的案例(双关语)。特别是,相关的“决策路径”指的是15.12.2.5(有些复杂)的描述。在JLS中选择最具体的方法。

该节首先说:

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

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

但参考规范:

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

  • m2不是泛型的,m1m2通过严格或松散的调用适用,其中m1具有形式参数类型S1,...,Snm2具有形式参数类型T1,...,Tn,类型Si比Ti更具体对于参数ei对于所有i(1≤i≤n,n=k)。

...

对于任何表达式,如果S

后者指的是4.10。子类型部分,其中父类型关系:

因此,方法测试(int,float)比测试(long,double)更具体,因为int是long的子类型,而float是double的子类型。

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

 类似资料:
  • 问题内容: 示例代码为: 输出为: 的第一个调用会调用带有String参数的方法,根据可以理解。 1)谁能解释我在先前的调用中是基于什么来调用的? 2)再说一次,说一个if条件: 它总是使用 调用方法。 编译器在编译时会计算表达式吗?我想知道表达式是在编译时还是在运行时计算的。谢谢。 问题答案: Java使用早期绑定。在编译时选择最具体的方法。根据参数数量和参数类型选择最具体的方法。在这种情况下,

  • 我目前正在研究Typescript中的重载。 假设我有一个重载的函数: 要么调用函数时没有参数,要么调用函数时有两个参数(foo和bar)。根据vscode的智能感知,结果变量具有布尔|未定义的类型。 为什么即使我已经测试了参数,仍然可以?如果存在,那么类型推断不应该预测也存在吗?

  • 我正在做Java类练习。我有一段代码,其中包含一个重载方法: 主要: 当我在main中调用方法时,我预计会出现错误,但它调用方法而我的是一个数字,它的大小大于的大小(8字节/4字节)所以我想知道这些原始类型是如何工作的?

  • 我当时正在研究超载问题,我完全被促销搞糊涂了。我看了SO(函数重载中的隐式转换序列)中的几篇文章,我确信还有一些文章可用,但找不到合适的文章。我也指的是http://www.dcs.bbk.ac.uk/~roger/cpp/week20。htm。我在看Stroustrup的C编程特别版时,看到了下面的解释。 通过在参数表达式的类型和函数的参数(形式参数)之间寻找最佳匹配,可以从一组重载函数中找到要

  • 问题内容: 让我们看一下这个简单的Java代码: 我试图找出三个eat()方法的哪个版本。现在,当我键入 输出是“一般动物食用”,这是完全可以理解的。 当我键入以下内容时,会发生相同的事情: 输出是“吃干草的马”,这完全是合乎逻辑的。 这就是让我感到困惑的地方。当我键入: 我得到: 我希望编译器从Animal类引用而不是Horse对象引用中调用eat()方法。 所以我的问题是,当我有一个引用对象类

  • 问题内容: 如果有两个方法,则它们具有不同的参数,并且它们的返回类型也 不同 。像这样: 如果返回类型相同,则当然是 重载 。但是由于返回类型 不同 ,我们还可以将其视为 过载 吗? 问题答案: 考虑过载的以下几点: 在Java中重载方法的首要原则是更改方法签名。方法签名由参数数量,参数类型和参数顺序(如果它们是不同类型)组成。 } 方法的返回类型从不属于方法签名的一部分,因此仅更改方法的返回类型