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

当我们将int参数传递给重载方法时会发生什么,重载方法将浮点作为一个方法的参数,而另一个方法具有双参数

艾凯捷
2023-03-14

在超载的概念中,我有一个疑问,那就是。当我用int值重载方法时,方法调用的是浮点参数方法,而不是双参数方法。

void method1(float f){
System.out.println('float');
}

void method1(double f){
System.out.println('double');
}

方法调用:

method1(10);

输出:浮点

如本链接中的java教程所述,如果浮点文字以字母F或f结尾,则它是浮点类型;否则它的类型是双精度的,可以选择以字母D或d结尾。

对于上述情况,方法调用应该调用双参数方法。但它调用的是浮点参数方法。

超载过程是如何在这个地区发生的?。

共有3个答案

彭坚壁
2023-03-14

在Java中,子类和超类之间存在关系,基元从字节短......到双精度也存在升级关系。

规则是,每当选择哪种重载方法存在歧义时,就选择升序中最接近一个子类重载方法或最接近的基元。

姬昀
2023-03-14

根据http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

5.1.2. 加宽图元转换

19对原始类型的特定转换称为加宽原始转换:

字节到short、int、long、float或double

短到int、长、浮点或双精度

字符到int、long、float或double

int到long、float或double

长到浮动或加倍

浮动到双精度

邹星火
2023-03-14

测试代码的变体时,除了使用字节和重载方法外,还有各种组合的短、int和长方法,这似乎意味着编译器选择了“最小加宽”转换(如果有多个可用)。

因此:

  • int之间,如果您使用byte调用重载方法,变体将被选择
  • intlong之间,如果您使用byte调用重载方法,int变体将被选择

等等

因此,由于long可以加宽为floatdouble,并且float转换是“最小加宽”,因此选择了float重载。

我认为这是因为编译器解决多个可能的重载的“选择最具体的重载”方式。来自JLS,第15.12.2.5节:

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

因此,采用浮点数的方法比采用双精度的方法“更具体”,因为采用浮点数的方法处理的任何调用都可以由采用双精度的方法处理,但不能反过来。

 类似资料:
  • 问题内容: 我试图衡量几种方法的执行时间。所以我在想做一个方法,而不是多次重复相同的代码。 这是我的代码: 假设我有,如何使用它来衡量执行时间? 问题答案: 方法不是Java中的一流对象,因此不能将它们作为参数传递。您可以将方法调用包装在扩展例如接口的匿名类中:

  • int是byte、short、int、long的默认文字,然后是为什么byte c=15被接受而不进行强制转换,但不接受方法参数。 提前谢谢你。

  • 我如何将变量从主方法发送到方法A,以及我应该在方法B中的A()中传递什么参数。 代码:

  • 问题内容: 以下代码的输出是因为从beginIndex到EndIndex-1。但是,令我惊讶的是这里的3(int)因为是两个整数。这背后的概念是什么? 问题答案: 一直到C,从本质上讲是一个窄整数类型,并在需要时隐式转换为C。 在Java中,这在技术上称为“扩展原始转换”,在JLS的5.1.2节中进行了介绍。

  • 问题内容: 我很好奇Go中是否有可能。我有多种方法的类型。是否可以有一个函数,该函数需要一个方法参数,然后将其称为类型? 这是我想要的一个小例子: Go认为type 有一个称为的方法,而不是用传入的方法名称替换它。 问题答案: 是的,有可能。您有2(3)个选项: 规范:方法表达式 该表达式产生的功能与第一个参数等效,但具有一个显式接收器。它有签名。 在这里,方法接收器是显式的。您只需将方法名称(具

  • 我有静态方法在我的类 这就是定义 这里用的是 这是我得到的一个错误 E0167类型为“void(TV_DepthCamAgent::)(int count,int copied_file)”的参数与类型为“void()(int,int)”的参数不兼容 错误C3867“TV_DepthCamAgent::progress_callback”:非标准语法;使用' 我做错了什么?