0

我已经浏览了这个链接;但我对以下示例代码感到困惑:-

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!

任何建议,请

4

2 回答 2

2

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

于 2012-10-28T17:31:49.687 回答
1

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

但是,在您的示例中,您有 2 个分别带有 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,它会起作用。

于 2012-11-06T14:19:14.973 回答