java - 使用可变参数重载时方法不明确

标签 java overloading

我是 Java 新手。今天在《Thinking in 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');
    }
}

编译提示:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method f(float, Character[]) is ambiguous for the type OverloadingVarargs2 

最佳答案

问题出在 f('a', 'b');

这两种方法都有一个可变参数,这意味着它们都将在 third and final phase of overloading resolution 中被考虑.

'a'是一个char,可以通过Widening Primitive Conversion自动转换为float .

'a''b' 都可以使用 Boxing Conversionchar 转换为 Character .

因此 f(float i, Character... args)f(Character... args) 都适用于参数 'a' 'b',并且没有一个优先于另一个。

关于java - 使用可变参数重载时方法不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33806017/

相关文章:

java - 带返回值的 try{} finally{} 构造

java - java.awt.geom.Area 的 android 等价物是什么?

java - 如何以某种方式实例化部分实现接口(interface)的类

java - XINS 以外的 Java 的 eXtreme Design-by-Contract?

c# - 为什么重载方法的优先级低于实例方法

java - 未知的 sql 查询

java - Groovy 方法重载 : selection of method prefers interfaces over subclasses?

java - 在这种情况下,jvm 如何解析对重载方法的调用?

inheritance - VB6在子类中访问父类的重载接口(interface)子程序

C++ 相同的方法签名但不同的返回类型