我已经完成了这个link;但我对以下示例代码感到困惑: -
public class NullTest {
public static void method(Object obj){
System.out.println("method with param type - Object");
}
public static void method(String str){
System.out.println("method with param type - String");
}
public static void method(StringBuffer strBuf){
System.out.println("method with param type - StringBuffer");
}
public static void main(String [] args){
method(null); //... compile-time error!
}
}
我得到的错误是: -
ankit@stream:/home/Data/JAVA/practice$ javac trickyMethodOverloading.java
trickyMethodOverloading.java:16: error: reference to method is ambiguous, both method method(String) in trickyMethodOverloading and method method(StringBuffer) in trickyMethodOverloading match
method(null); //... compile-time error!
请提出任何建议
答案 0 :(得分:2)
您的所有方法都具有相同的名称。 Java现在可以区分它们的唯一方法是它们接收的参数,因此它知道使用哪一个。但是,使用null
不会缩小任何内容,因此编译器无法完成编译,因为它不知道要使用哪一个。
答案 1 :(得分:1)
在这种方法重载的情况下,只要在继承中使用的类属于同一个分支,就会在运行时选择最具体的方法,或者换句话说,属于继承树层次结构中最深类的方法。树,这样就可以找到一个没有含糊不清的类。 (根据我自己的理解,而不是来自java文档:))
但是,在您的示例中,您有两个分别使用String和StringBuffer的重载方法,这些方法不属于继承树中的同一分支。这就是编译器抱怨的原因。
如果你有一个层次结构,例如3个A,B,C类,其中B扩展A和C扩展B,这种示例有效。在这种情况下,如果你有
public class NullTest{
public static void method(A a){
System.out.println("method with param type - A");
}
public static void method(B b){
System.out.println("method with param type - B");
}
public static void method(C c){
System.out.println("method with param type - C");
}
public static void main(String [] args){
method(null);// compiles successfully and will print- "method with param type - C"
}
}
这是有效的,因为A,B和C属于继承树中的相同层次结构。因此编译器只是尝试进入最深层次,它可以找到一个没有歧义的类(在这种情况下为C)。 此外,如果从代码中删除String或StringBuffer,它将起作用。