【问题标题】:Method Overloading ambiguous方法重载不明确
【发布时间】:2018-10-01 06:42:07
【问题描述】:

我目前正在复习 OCA 考试,并认为 int/float 方法适用于第三次考试。

在 Jeane Boyarsky 的 OCA 学习指南中只说了 4 个顺序规则来选择正确的重载方法。

  1. 按类型精确匹配
  2. 更大的原始类型
  3. 自动装箱类型
  4. 可变参数

有人可以解释为什么 java 说它模棱两可吗?

public static void main(String... args){
    OverLoadingMethod ov=new OverLoadingMethod();
    ov.test(1F,2);
    ov.test(1,2F);
    ov.test(1,2);
}
public void test(float i,int j){
    System.out.println("float/int");        
}

public void test(int i,float j){
    System.out.println("int/float"); 
}
public void test(float i,float j){
    System.out.println("float/float");
}

产生这个错误

OverLoadingMethod.java:12: error: reference to test is ambiguous
        ov.test(1,2);
          ^
  both method test(float,int) in OverLoadingMethod and method test(int,float) in OverLoadingMethod match

【问题讨论】:

  • 认为它应该调用哪个方法?为什么?
  • 我认为它应该调用 test(int,float) 尽管 test(float,int) 会起作用。编译器应该优先考虑第一个有效参数,即 int。然后将第二个参数按照规则#2 转换为浮点数
  • 编译器应该优先考虑第一个有效参数 - 这是在哪里声明的?
  • @Javajansen“编译器应该”谁说应该?
  • 这只是我的想法。如果我是编译器,这就是我的大脑的工作方式。

标签: java overloading


【解决方案1】:

没有一个重载需要两个整数。

因此,必须将其中一个整数加宽为浮点数。但是哪一个? float 为第一个参数时存在重载,float 为第二个参数时存在另一个重载。

应该选哪个?哪个客观上更好?根据语言规范的规则,也不是。因此模棱两可。

【讨论】:

    【解决方案2】:

    Java 自动将 int 转换为 float,因为不会损失精度。

    因此,您的test(1,2) 可以解释为两个浮点参数,一个浮点数 - 一个整数,一个整数 - 一个浮点数。因此它对编译器来说是模棱两可的。

    【讨论】:

      【解决方案3】:

      对于ov.test(1,2)test(int i,float j)test(float i,int j) 均可访问且适用。然后编译器需要选择最具体的一个,而其中任何一个都不够具体,所以会发生编译器错误。

      完整的选择过程在java language specification 15.12.2.5. Choosing the Most Specific Method中描述

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 2019-04-28
        • 2012-03-02
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        相关资源
        最近更新 更多