在java中引用不明确的引用

时间:2013-01-01 19:23:33

标签: java

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");

    }
}

为什么,它显示引用不明确的 ??

2 个答案:

答案 0 :(得分:2)

如果删除varargs表示法,它实际上会编译。文字2应该被视为int,而不是float,所以我希望编译器会选择A中的printFirst。

看起来这与编译器如何进行方法调用转换有关。 This SO question说这是在规范中,但是与此问题相关的已接受答案的部分似乎是矛盾的(它表示你不能将扩展转换(int to float)与varargs结合起来,但后来它说这没关系)。讨论了一个类似的问题in this question,并且接受的答案得出的结论是,这个案例实际上没有说明(遗憾的是现在讨论的链接已经被打破)。更糟糕的是,语言指南只是建议avoiding this type of overloading

答案 1 :(得分:0)

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

根据§15.12.2.5 "Choosing the Most Specific Method" of The Java Language Specification, Java SE 7 Edition,您看到的编译错误只有在“没有方法是最具体的,因为有两种或更多种方法最具体”时才会发生(加上各种其他限制) 。但情况并非如此:在您的情况下,B.printFirst(float...) 最具体,因为如果某个方法可以访问且适用,那么最大限度地“没有其他适用且可访问且严格更具体的方法“,在您的情况下,A.printFirst(int...)严格更具体,因为intfloat和{{1}的子类型}}不是float的子类型。

顺便说一下,你的int很可能是红鲱鱼;至少在Eclipse中,只需编写:

就可以触发相同的编译错误
class B