java - 方法重载不明确

标签 java overloading

我目前正在复习 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

最佳答案

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

因此,必须将其中一个整数扩展为 float 。但哪一个呢?当 float 是第一个参数时存在重载,当 float 是第二个参数时存在另一个重载。

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

关于java - 方法重载不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52585777/

相关文章:

c++ - 如何使用 SFINAE 禁用方法重载集?

fortran - 在fortran中重载时参数中的排名不匹配

java - 串行数据事件监听器 Java

java - 使用 log4j 的多个日志文件

java - Java 输入缓冲区中的空字符持久性?

c++ - 通过引用传递的问题

c# - 函数调用决定函数的返回类型

java - 无法使用扫描仪读取 Double

java - ServerSocketChannel 或端点

c++ - 使用 CRTP 继承