Ingsuifon 2020-03-13 23:45 采纳率: 0%
浏览 148

带有可变参数的方法的重载问题

public class Main {
    public static void main(String[] args) {
        f(1.0f, 'a', 'b');
        f('a', 'b');
    }

    static void f(float i, Character... args) {
        System.out.println("first");
    }

    static void f(Character... args) {
        System.out.println("second");
    }
}

想知道为什么这样也会让编译器不知道用哪个,不是应该根据类型来匹配吗?

  • 写回答

1条回答 默认 最新

  • 乔没乔见Joe 2024-09-15 08:39
    关注

    在 Java 中,方法重载是根据参数的类型进行匹配的,但在某些情况下,编译器可能会遇到模糊性,无法确定调用哪个重载的方法。

    在你的代码中:

    f(1.0f, 'a', 'b');
    
    1. f(float i, Character... args) 方法接受一个 float 和一个可变参数 Character
    2. f(Character... args) 方法接受一个可变参数 Character

    当调用 f(1.0f, 'a', 'b') 时,1.0ffloat 类型,'a''b'char 类型。由于 char 可以自动装箱为 Character,所以这两个方法的参数都可以匹配:

    • 第一个方法可以匹配为 f(float, Character...)
    • 第二个方法可以匹配为 f(Character...),其中 1.0f 会被忽略,两个 char 会被装箱为 Character

    由于两种方法都可以匹配,编译器无法决定使用哪个,因此会出现编译错误。

    虽然方法重载是根据参数类型匹配的,但在这种情况下,由于参数的自动装箱和可变参数的特性,导致了模糊性,编译器无法确定调用哪个重载的方法。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀