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");
}
}
为什么,它显示引用不明确的 ??
答案 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...)
严格更具体,因为int
是float
和{{1}的子类型}}不是float
的子类型。
顺便说一下,你的int
很可能是红鲱鱼;至少在Eclipse中,只需编写:
class B