1
class A {

    public void printFirst(int... va) throws IOException{
        System.out.print("A");
    }

    public static void main(String args[]) {
        try {
            new B().printFirst(2);
        } catch (Exception ex) {
        }
    }
}


class B extends A {

    //@Override
    public void printFirst(float... va) throws IOException{
        System.out.print("B");

    }
}

为什么,它显示了对 call ambiguous 的引用

4

2 回答 2

2

如果您删除可变参数符号,它实际上会编译。文字2应该被认为是inta ,而不是 a float,所以我希望编译器会选择 A 中的 printFirst 。

看起来这与编译器如何进行方法调用转换有关。这个 SO question说它在规范中,但是与这个问题相关的已接受答案的部分似乎是矛盾的(它说你不能将扩大转换(int to float)与可变参数结合起来,但后来它说这是好的)。在这个问题中讨论了一个类似的问题,并且接受的答案得出结论认为这种情况实际上是未指定的(不幸的是,讨论的链接现在已断开)。更糟糕的是,语言指南只是建议避免这种类型的重载

于 2013-01-01T20:10:04.867 回答
0

这似乎是您的编译器中的一个错误;我可以在一个编译器(Eclipse)中重现您的编译错误,但不能在另一个(javac)中重现,我相信后者是正确的。

根据§15.12.2.5 "Choosing the Most Specific Method" of The Java Language Specification , Java SE 7 Edition,您看到的编译错误应该只发生在“没有最具体的方法,因为有两个或更多最具体的方法”(加上各种其他限制)。但这里的情况并非如此:在你的情况下,不是B.printFirst(float...)最具体的,因为一个方法是最具体的“如果它是可访问和适用的,并且没有其他适用和可访问的方法更具体”,并且在你的case,严格来说更具体,因为它是 的子类型,而不是 的子类型。A.printFirst(int...)intfloatfloatint

顺便说一句,您class B很可能是红鲱鱼;至少在 Eclipse 中,您可以通过简单地编写来触发相同的编译错误:

class A
{
    public static void printFirst(float... va)
        { System.out.print("float..."); }
    public static void printFirst(int... va)
        { System.out.print("int..."); }
    public static void main(String args[])
       { printFirst(2); }
}
于 2013-01-02T01:39:16.963 回答