[Java]《On Java》阅读记录之 -- 可变参数重载问题

2022/9/4 1:25:16

本文主要是介绍[Java]《On Java》阅读记录之 -- 可变参数重载问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

《On Java》阅读记录之 -- 可变参数重载问题

有下面一段代码:

public class OverloadingVarargs2 {
    static void f(float i , Character... args) {
        System.out.println("first");
    }
    static void f(Character... args) {
        System.out.println("second");
    }
    public static void main(String[] args) {
        f(1,'a');
        f('a','b');
    }
}

编译后,会看到如下错误信息:

OverloadingVarargs2.java:14: error: reference to f is ambiguous
 f('a', 'b');
\^
both method f(float, Character...) in OverloadingVarargs2 and method
f(Character...) in OverloadingVarargs2 match
1 error

这个报错是说,方法 f 引用不明确,对 f 的引用有二义性。

一开始一直没太理解为什么会有二义性,查阅了一些文档后明白了。

f('a', 'b');引用不明确是因为,同时匹配了f(float, Character...)f(Character...)

因为 f('a', 'b') 中的 'a'char类型)可以会进行隐性的类型转换,可以自动转换成 float 类型(因为是从小转到大的,可以进行自动转换)。

所以说 f('a', 'b') 与两个方法都匹配,方法 f 存在二义性。

可以对代码进行以下修改以消除二义性:

public class OverloadingVarargs2 {
    static void f(float i , Character... args) {
        System.out.println("first");
    }
    static void f(char c, Character... args) {
        System.out.println("second");
    }
    public static void main(String[] args) {
        f(1,'a');
        f('a','b');
    }
}

给两个方法都添加一个非可变参数,这样 f('a','b') 可以明确匹配到 f(char c, Character...) 上,就没有问题了。

多学习,多思考,保持热情,方有收获。



这篇关于[Java]《On Java》阅读记录之 -- 可变参数重载问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程