【发布时间】:2014-03-05 05:16:54
【问题描述】:
我有一个类有两个这样的方法:
public class Dummy{
public void doIt(String arg1, File arg2, Writer... ctx){
// Do something very important...
}
public void doIt(String arg1, Writer... ctx){
// Do something else...
}
public static void main(String[] args){
new Dummy().doIt("Test", null);
}
}
我希望编译器会给出错误,因为方法调用是模棱两可的。而是调用第二种方法。
在我们的例子中,模棱两可的方法是从数据库方法和稍后添加的可变参数生成的。现在我们不知道如何避免示例中的方法调用问题。
有没有其他人有这个问题以及如何解决它的想法?
【问题讨论】:
-
如果要使用第二种方法,请使用
new Dummy().doIt("Test", null, null);。 Java 将优先考虑最合适的方法,并且由于 varargs 整体上是可选的(没有参数是有效的 varargs 调用),所以前者更具体。如果您想知道确定最合适方法的确切规则,那么您必须查看 JLS。 -
@user3284827: 你用的是什么编译器?使用 JDK 7,我已经收到有关该调用的警告。要调用第一个方法,只需将 null 转换为
File。 -
JLS § 15.12 是这方面的权威,但它非常庞大且难以理解。
-
答案可能在 JLS 15.12.2.5 中,如果适用,则选择最具体的方法;稍后它讨论了它如何确定一种方法是否比另一种方法更具体用于可变参数方法。不过,我还不明白它是如何工作的。这是相当强大的。但我怀疑答案就在这部分。
-
这些方法做这些不同的事情吗?当你说它们是从数据库方法生成的时候,它让我想到了一个持久性框架。如果目标是插入或更新一行,那么这两种方法不会导致第一个参数的值和未指定的其余参数的值吗?或者,换一种说法,你能否在这种情况下使语义相同,以便编译器选择哪种方法无关紧要?
标签: java compiler-construction variadic-functions ambiguous