如果我在Java中写下这行代码:
JOptionPane.showInputDialog(null, "Write something");
哪个方法将被调用?
showInputDialog(Component parent, Object message)
showInputDialog(Object message, Object initialSelectionValue)
我可以测试它。但在其他类似情况下,我想知道会发生什么。
如果我在Java中写下这行代码:
JOptionPane.showInputDialog(null, "Write something");
哪个方法将被调用?
showInputDialog(Component parent, Object message)
showInputDialog(Object message, Object initialSelectionValue)
我可以测试它。但在其他类似情况下,我想知道会发生什么。
将调用最具体的方法 - 在这个例子中
showInputDialog(Component parent, Object message)
这通常属于规范中的重载解析的"确定方法签名"步骤(15.12.2),特别是"选择最具体的方法"。
不详细介绍(您可以在规范中阅读),引言给出了一个很好的摘要:
如果有多个成员方法既可访问又适用于方法调用,则需要选择一个方法来为运行时方法分派提供描述符。Java编程语言使用的规则是选择最具体的方法。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会产生编译时类型错误,则一个方法比另一个方法更具体。
f(Integer i)
和f(String s)
这两个方法时,调用f(null)
会发生什么情况呢?看起来两个方法的具体性相同。 - Stephan202The method f(Integer) is ambiguous for the type ExampleClass
的错误提示。这是针对静态方法的。 - Powerlordpublic class Main {
public static void main(String[] args) {
Main m = new Main();
m.testNullArgument(null);
}
private void testNullArgument( Object o )
{
System.out.println("An Object was passed...");
}
private void testNullArgument( Integer i )
{
System.out.println("An Integer was passed...");
}
private void testNullArgument( String s )
{
System.out.println("A String was passed...");
}
}
在这种情况下,编译器无法决定使用需要一个整数的方法还是需要一个字符串的方法。 当我尝试编译时,我会得到以下错误:
reference to testNullArgument is ambiguous, both method testNullArgument(java.lang.Integer) in testnullargument.Main and method testNullArgument(java.lang.String) in testnullargument.Main match
都不对。你会收到一个编译器错误,要求你澄清你想要调用哪个方法。你可以通过明确转换第一个参数来这样做:
showInputDialog((Object) null, "Write something");
或者
showInputDialog((Component) null, "Write something");
更新 我应该知道 - 永远不要怀疑Jon Skeet。我上面提到的问题只会在无法确定哪种方法更具体时发生。这是一个测试案例:
public class Test {
public void doSomething(String arg1, Object arg2) {
System.out.println("String, Object");
}
public void doSomething(Object arg1, String arg2) {
System.out.println("Object, String");
}
public static void main(String[] args) {
Test test = new Test();
test.doSomething(null, null);
}
}
showInputDialog()
会抛出编译器错误,但实际上并不会。 - ChssPly76