选择最具体的方法 - 棘手的方法重载?

时间:2012-10-28 17:14:53

标签: overloading

我已经完成了这个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!

请提出任何建议

2 个答案:

答案 0 :(得分:2)

您的所有方法都具有相同的名称。 Java现在可以区分它们的唯一方法是它们接收的参数,因此它知道使用哪一个。但是,使用null不会缩小任何内容,因此编译器无法完成编译,因为它不知道要使用哪一个。

答案 1 :(得分:1)

在这种方法重载的情况下,只要在继承中使用的类属于同一个分支,就会在运行时选择最具体的方法,或者换句话说,属于继承树层次结构中最深类的方法。树,这样就可以找到一个没有含糊不清的类。 (根据我自己的理解,而不是来自java文档:))

但是,在您的示例中,您有两个分别使用String和StringBuffer的重载方法,这些方法不属于继承树中的同一分支。这就是编译器抱怨的原因。Different branches in Inheritance                  Same branch in inheritance tree

如果你有一个层次结构,例如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,它将起作用。